C#接口、抽象类和密封类

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44800780/article/details/102709139

定义接口

定义接口和定义类相似,只不过使用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
这意味着派生类不能重写该方法.
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44800780/article/details/102709139