抽象方法
抽象类中才有的方法,要求派生类必须重载这个方法;
定义方式:
Code
/* 抽象类中抽象方法重写 */
public abstract class myclass
{
public abstract int myint();
}
public class myclass1 : myclass
{
public override int myint() //此处override必须,表示重写父类抽象方法
{
return 10;
}
}
注:抽象类中才能有抽象方法,抽象方法必须重写(override).有点类似C++中的纯虚方法.
虚方法
告诉编译器,这个方法可以重写。
当基类的方法与派生类的方法重名时,
可以选择派生类的方法从基类继承并重写(override), 还是,把基类的方法隐藏起来(hide)。
定义方式:
Code
/* 虚方法重写继承 */
class C
{
public virtual void method()
{
Console.WriteLine("C Method!");
}
}
class D : C
{
public override void method()
{
base.method();
Console.WriteLine("D Method!");
}
}
class DC : C
{
public new void method() //此处隐藏了父类的method方法,使用new关键字.
{ //如不不使用new,编译器会报警告消息,但仍然
//是隐藏父类访求method()
base.method();
Console.WriteLine("dc method!");
}
}
以上为类的创建方式,下面给出调用方式及上例输出结果:
1.抽象方法
抽象类中抽象方法重写
Console.WriteLine("/* 抽象类中抽象方法重写 */");
myclass mc = new myclass1(); //使用父类对象调用
Console.WriteLine(mc.myint()); //输出10
myclass1 mc1 = new myclass1(); //使用子类对象调用
Console.WriteLine(mc1.myint()); //输出10
说明:父类是抽象类,所以不能构造父类的对象(myclass mc=new myclass()); 而只能用父类来修饰子类对象,
这样同样可以调用到子类对象的方法.
2.虚方法
Code
Console.WriteLine("=============");
C cClass = new C();
cClass.method();//调用C中的method(),输出(C Method!)
Console.WriteLine("=============");
C cdClass = new D();
cdClass.method();//调用D中的method(),输出(C Method! D Method!);其中C Method!是由D中的base.method()输出.
Console.WriteLine("=============");
D dClass = new D();
dClass.method();//调用D中的method(),同上.
Console.WriteLine("=============");
//D dcClass = new C();//编译无法通过
//dcClass.method();
DC dcClass = new DC();
dcClass.method();//调用DC中的method(),输出(C Method! DC Method!);此处隐藏了父类的方法
Console.WriteLine("=============");
说明: 如果用类C修饰DC对象:
C dcClass2 = new DC();
dcClass2.method(); //调用C中的method(),输出(C Method!)
Console.WriteLine("=============");
总结:
重写时,访问父类,子类皆调用子类的重写方法;--其中抽象方法属于重写
隐藏时,访问父类则调用父类的方法,子类则调用子类的方法。--隐藏一般需要new关键字,否则有警告信息.
虚方法:
1.virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.
2.virtual方法可以直接使用,和普通方法一样
3.不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写
总之:virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别 .
关于关键字的使用:
基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.
如果基类没有virtual,刚派生类不能使用override,只能使用new,表示隐藏基类方法.
虚方法和抽象方法的区别:
1.虚方法可以有实现体,抽象方法不能有实现体。
2.抽象方法
要求派生类必须重载这个方法;