C# 接口(3)
这么半天说了如何使用,实现接口。相信也都发现了接口和抽象类很多相似的地方。
但是!
这两个根本就是不一样的。
抽象类 : 接口:
可以实现代码【非抽象方法】 不可以实现任何代码
唯一继承 多次继承
继承会延续下去 继承只会存在与第一次继承
这个基本就是这两个最大的区别
那么 接口的实现和抽象类的重写是差不多的吗?
其实还是不一样的。
抽象类的重写是必须使用关键字override。
接口的实现是不需要关键字。
还有
抽象类的抽象方法,抽象属性在被子类再次继承时是可以再次重写。
接口则是无法再次重写。
代码:
interface IHuman { string Name { get; set; } void Eat(); } interface ILanguage { void Say(); } class Iam : IHuman, ILanguage { string IHuman.Name { get; set; } void IHuman.Eat() => Console.WriteLine("吃"); void ILanguage.Say() { } } class IamSon : Iam//此处代码报错 { override void Eat() => Console.WriteLine("吃吃吃"); }
如果在IamSon类的Eat()方法使用new关键字,也会警告,因为Eat方法并不需要隐藏基类。
这是为什么呢?
代码:
interface IHuman { string Name { get; set; } void Eat(); } interface ILanguage { void Say(); } class Iam : IHuman, ILanguage { string IHuman.Name { get; set; } void IHuman.Eat() => Console.WriteLine("吃"); void ILanguage.Say() { } } class IamSon : Iam { } class Program { static void Main(string[] args) { Iam iam = new Iam(); (iam as IHuman).Eat(); IamSon iamSon = new IamSon();
iamSon.Eat();//此处代码报错 (iamSon as Iam).Eat();//此处代码会报错 Console.ReadKey(); } }
正常来说继承会延续下去,会继续遗传,但是显示接口的类的被继承之后,所显示的接口是无法延续下去。
换句说,接口的继承只具有一次性。