C#中的抽象方法,虚方法,接口之间的对比
1.首先来看一看抽象类
抽象类是特殊的类,不能够被实例化;具有类的其他特性;抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写。
另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
关键字就是 abstract
/* * 抽象方法必须写在,抽象类中 * */ public abstract class animal {
public abstract void sleep(); public abstract void eat(); }
这里定义了一个抽象类和两个抽象方法,之后我们在定义子类去继承它
/* *抽象类必须被重写 */ public class cat : animal { public override void eat() { console.writeline("我是cat,重写了eat"); } public override void sleep() { console.writeline("我是cat,重写了sleep"); } }
这里定义了一个cat类去继承animal,如果不实现的话,就会报如下的错误
这里vs开发工具就会提示我们实现抽象类,vs可以自动帮我们去实现,然后去写自己的代码就可以了,然后就是调用
animal an = new cat(); an.eat(); an.sleep();
因为cat类继承了animal并重写了里面的方法,所以我们可以直接替换animal让cat代替出现,抽象类同样也可以定义自己的方法,例如:
public abstract class animal { public void show() { console.writeline("我是抽象类自己的方法"); } public abstract void sleep(); public abstract void eat(); }
2.我们再来看一看虚方法
virtual关键字用于修饰方法
/* * 虚方法,必须有方法体 */ public class people { public virtual void sleep() { } public virtual void eat() { } }
定义虚方法必须要有方法体,然后定义子类去继承people
/* * 虚方法可以不被重写 */ public class student:people { public override void sleep() { console.writeline("我是student,"); } }
如果说只是继承了people这个类而没有去重写它的方法,这样的情况是不会报错的,我在这里只是重写了people的sleep方法,override后面加返回值类型 基类的方法名
然后就是调用
people op = new student(); op.sleep();
3.然后就是接口
接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量
/*
* 接口中的成员是隐式公有的,不能加修饰符
*/
public interface imyinterface
{
int aa { get; set; }
void test();
}
然后我们去定义子类,实现接口
public class overinterface : imyinterface { public int aa { get; set; } public void test() { console.writeline("我实现了接口,"); } }
如果不实现接口,就会报以下错误
然后就是调用
imyinterface ter = new overinterface(); ter.aa = 45; ter.test(); console.writeline(ter.aa);
那么我们来总结一下
抽象方法:
1.必须定义在抽象类中,
2.不能够被实例化
3.子类必须对其进行重写
4.定义抽象方法时不能够有方法体 { } 都不能有
5:关键字 abstract
虚方法:
1:可以不被重写
2:定义方法时能够有自己的方法体
3:关键字:virtual
接口:
1:定义时不能加访问修饰符,也不能有方法体
2:它的子类必须实现所有方法,与抽象类相似
3:关键字:interface
那么这里有一个问题:
接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
答案:
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
下一篇: 666