一,抽象的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Virtualdemo{
class Program {
static void Main(string[] args) {
//BClass A = new BClass();
抽象类无法被实例 Class1 c = new Class1();
BClass c2 = c;
c2.MethodA();
c.MethodA();
c2.MethodB();
c.MethodB();
c2.MethodC();
c.MethodC();
Console.ReadKey();
}
}
abstract class BClass //抽象类无法被实例 {
public virtual void MethodA() {
Console.WriteLine("BClassA");
}
public virtual void MethodB() {
Console.WriteLine("BClassB");
}
public virtual void MethodC() {
Console.WriteLine("BClassC");
}
}
class Class1 : BClass {
public void MethodA() {
Console.WriteLine("MethodA");
}
//如果一个虚函数 在子类中没有通过override关键字,那么这个方法就没有被重写,而是被隐藏了 public override void MethodB() {
Console.WriteLine("MethodB");
}
public override void MethodC() {
base.MethodC();
}
}
}
从上图得出的结果是:
综上:抽象类的虚方法需要被重写,那问题来了重写有两种方式,new和override又有什么区别
二,new和override重写的区别:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Virtualdemo{
class Program {
static void Main(string[] args) {
Teacher t = new Teacher();
Student stu = t;
stu.Exam();
stu.Say();
t.Say();
Console.ReadKey();
}
}
public abstract class Student {
public virtual void Exam() {
Console.WriteLine("学生都要考试");
}
public void Say() {
Console.WriteLine("我是学生");
}
}
public class Teacher : Student {
public override void Exam() {
Console.WriteLine("老师不用考试");
}
//public override void Say() //报错,提示没有virtual,无法被重写 //{
// Console.WriteLine("我是老师");
//}
public new void Say() {
Console.WriteLine("我是老师");
}
}
}
结果显示为:
综上总结:
1、如果基类没有定义虚方法,那子类只能使用new,而不能使用override
2、基类有没有定义虚方法,子类都可以使用new
3、子类使用new并不叫重写,而是子类新创建一个方法,只是新创建的这个方法刚好跟基类中的方法同名
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。