一、virtual(虚拟的) override(覆盖)
根据上一篇得知,fly是bird父类,在bird中引用父级中的方法fly1(),返回值为"我可以飞"。但是在bird类中,引用父类的fly1()方法不能满足要求,需要返回的输出值为“我可以靠自己的翅膀飞行”。以此类推,在fly的各种子类中,都想表达出子类自身所具有的特征,那么此时,就需要对父类fly的方法进行修改,需要进行设置虚函数(virtual)。
//父类格式 public virtual 数据类型 名字() { 执行语句 }
//子类中 public override 数据类型 数据名() { 新的执行语句 } //此时重新调用父类中的方法,就会显示新的执行语句!
1,同样都是继承了同一个父类,但父类中的方法并不适用任何一个子类,那么在这就需要重新编写这个方法的主体。
(1)需要父类同意子类可以重新编写自己的方法,关键词:virtual,在public之后
(2)子类只能重新写父类允许重写的方法,只能重写虚方法。关键词override,在public之后。
2,所有的类都可以当做父类,都可以有虚方法。
二、接口 interface
抽象类函数,关键词;abstract。抽象函数不能实例化。需要被继承,在子类里面调用其方法。
举例子吧
建立ren类
//在ren类里面设置虚函数 public abstract string chi(); //注意,没有“{执行语句}”,因为即使写了,在子类中也不引用,需要再子类中重新编写 public abstract string shui(); public abstract string dong(); public string yue() //不是抽象方法,为了证明抽象类里面也可以有非虚类函数 { return "约会去了!!"; } public virtual string yuyan() //不是抽象方法,为了证明抽象类里面也可以有虚类函数 { return "我会说hua!"; }
抽象类函数就是为了被继承而出现的(他的建立就是为了当父类)。
普通的类中所有的方法都变为虚方法,没有人用最基础的方法(父类方法),在子类中需要重新编写,那么就不需要那么费劲的把普通类中的方法全部写完,于是,直接定义为抽象类,并且都写成抽象方法。
只声明方法的名称和返回值,具体方法是什么,继承过去以后自己(在子类中)去实现。
//新建一个nan类,继承ren类 public class nan:ren { public override string chi() //跟virtual一样用override { return "大口大口的吃!"; } public override string shui() { return "在女人身边睡觉!"; } public override string dong() { return "打篮球"; }//然后在main函数里面实例化nan,就可以调用nan和ren里面的函数了。
抽象方法一定在抽象类中。
有抽象方法的类,一定是抽象类。
抽象类中不一定只有抽象方法,也可以由其他的方法。
为了让nan这个类更加完善,还需要继承其他的类(如yule,gongzuo),那就需要接口了。
父类只能有一个,其余的都是借口。就像亲爹(父类)只有一个,其余的为干爹(接口interface)。
//新建gongzuo类 public interface gongzuo //interface 原先位置为class。 { string jineng(); //为抽象方法。数据类型+数据名字()。 string didian(); } //然后在nan类继承ren类的后面写个逗号,加上gongzuo,如下图,这样接口就好了。
然后就需要在nan类里面写接口里面的方法(必须写)
public class nan:ren { public override string chi() { return "大口大口的吃!"; } public override string shui() { return "在女人身边睡觉!"; } public override string dong() { return "打篮球"; } public string jineng() { return "巧妹子"; } public string didian() { return "夜色"; }//在main函数里面调用就可以了。
接口类里面的方法都是抽象方法(数据类型+数据名字()),没有其他一点儿东西。全部内容需要全部在子类中实现(在子类中一个方法都不能少)。
完!!!