首先分别建立三个类,分别为person,man,women
其中person为父类,man继承person,women继承man
virtual用法:
1. 在父类中定义virtual方法,但在子类中没有override该方法,则子类调用父类该方法时输出父类方法的值。
2.在父类中定义virtual方法,在子类中override该方法,则子类调用父类该方法时输出子类重写父类方法的值。
重写
class Person
{
public virtual void Say()
{
Console.WriteLine("我是你爸爸");
}
}
class Man:Person
{
public override void Say()
{
base.Say();
Console.WriteLine("我是你儿子");
}
}
class women:Man
{
public override void Say()
{
//base.Say();
Console.WriteLine("我是你女儿");
}
}
base.Say();是用于重写时同时输出父类方法的值
在主程序中实例化
//输出(我是你爸爸)
person p=new person();
p.Say();
//父类实例化子类,会输出子类中的值,不能用子类去实例化父类,
//若在重写的方法中加入base,则会在实例化的子类中同时输出父类方法和子类方法的值
person p=new man();//我是你儿子
person p1=new women();//我是你女儿
man m=new women();//我是你女儿
重载:同名不同参数或参数类型
class Man:Person
{
public override void Say()
{
base.Say();
Console.WriteLine("我是你儿子");
}
public virtual void Say(string s)
{
Console.WriteLine(s);
}
}
用virtual关键字,在子类women中则可重写Say(string s)
Man m = new Man();
m.Say("2");
abstract:可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的父类,不能实例化,而且abstract修饰的成员在子类中必须全部实现,不允许部分实现,否则编译异常.
abstract class Person
{
public virtual void Say()
{
Console.WriteLine("我是你爸爸");
}
public abstract void Apple();
}
class Man:Person
{
public override void Apple()
{
Console.Write("abstract");
}
}
Man m = new Man();
m.Apple();//输出abstract
父类person采用abstract关键字,定义apple方法,在子类man中必须override该方法,且person类无法实例化。