C#接口、抽象类和密封类
作者:互联网
定义接口
定义接口和定义类相似,只不过使用interface关键字.
在接口中按照与类和结构一样的方式声明方法,不允许指定任何访问修饰符.
此外,接口中的方法是没有实现的,它们只是声明。实现接口的所有类型都必须提供自己的实现 .下面是一个例子:
interface Icomparable
{
int CompareTo(object obj);
}
接口不含任何数据;不可以向接口添加字段.
实现接口
为了实现接口,需要声明类或结构从接口继承,并实现接口指定的全部方法.
注意:
1.实现接口方法名和返回类型完全匹配.
2.所有参数完全匹配
3.用于实现接口的所有放啊都必须具有public可访问性.但如果显示接口实现,不应该为方法添加访问修饰符.
一个类可以继承类的同时实现多个接口,基类名写在签名,接口名写在后面.
通过接口引用类
接口变量也能引用实现了该接口的类的对象。
通过接口来引用对象是一项相当有用的技术.因为能由此定义方法来获取不同类型的实参。
使用多个接口
一个类最多只能有一个基类,但可以实现数量不限的接口.
类必须实现这些接口规定的所有方法.
显示实现接口
前面的例子是隐式实现接口.但是如果Horse类实现了多个接口,并且有同名的方法怎么办?
上面实现的接口到底是实现哪一个的接口呢?
默认情况下,C#不区分方法实现的哪个接口,所有实际是用一个方法实现了两个接口.
为了解决这个问题,并区分哪个方法实现的是哪个接口,应该显示实现接口.
除了为方法附加接口名前缀,方法还去掉了public标记。方法是显示接口实现的一部分,就不能为方法指定访问修饰符。
在代码中创建一个Horse变量,两个NumberOfLegs方法都不能通过该变量来调用,因为它们都不可见。那么一下代码会调用哪一个-ILandBound接口的?还是Ijourney接口的?
Horse horse = new Horse();
int legs = horse.NumberofLegs();//无法编译
那么怎么访问这些方法呢?
答案是通过恰当的接口来引用Horse对象。
接口的限制
1.不能在接口中定义任何字段。
2.不能在接口中定义 任何构造器。
3.不能在接口中定义任何析构器.
4.不能为任何方法指定访问修饰符
5.不能在接口中嵌套任何类型(枚举、结构、类或其他接口)
6.一个接口能从另一个接口继承,但不允许从结构或类继承.
抽象类
为明确声明不允许创建某个类的实例,可以用abstract关键字实现.
比如:
abstract class GrazingMammal : Mammal, IGrazable
{
...
}
…
…
抽象方法
抽象类可以包含抽象方法,和虚方法相似,只是不含方法主体。派生类必须重写抽象方法。抽象方法不可以私有.
如一个方法在抽象类中提供默认实现没有意义,但又需要派生类提供该方法的实现,就适合定义成抽象方法.
abstract class GrazingMammal : Mammal, IGrazable
{
public abstract void DigestGrass();
}
…
…
密封类
如果不想一个类作为基类使用,可用C#提供的sealed关键字防止类被用作基类.
比如:
sealed class Horse : GrazingMammal, ILandBound
{
...
}
注意,结构隐式密封,永远不能从一个结构派生.
密封方法
可用sealed关键字声明非密封类中的一个单独的方法是密封的.只有用override关键字声明的方法才能密封,而且方法要声明为sealed override
这意味着派生类不能重写该方法.
标签:Horse,密封,C#,修饰符,接口,实现,抽象类,方法 来源: https://blog.csdn.net/qq_44800780/article/details/102709139