抽象类/抽象方法

  在现实生活中我们发现,一个类中的某个或某几个方法是无法具体实现的。例如,我们前面使用的Shape类中的画图draw()方法。当你不知道具体要画什么形状,比如长方形或者三角形时,你怎么可能实现一个画形状的方法呢?在C#中,这样的方法我们叫做抽象方法。一个类如果有一个或多个抽象方法,这个类就叫做抽象类。
  用abstract修饰符来修饰- -个类时, 该类叫做抽象类;用abstract 来修饰-一个方法时,该方法叫做抽象方法。
  abstract ReturnType abstractMethod( [paramlist] ) ;

1)抽象类必须被继承,抽象方法必须被重写。
2)抽象类不能被直接实例化,因此它一般作为其他类的基类。
3)抽象方法只需声明,而不需实现。定义了抽象方法的类必须是抽象类。

抽象方法就是在声明方法时加上abstract关键字。声明抽象方法时需要注意以下两点:
抽象方法必须声明在抽象类中。
声明抽象方法时,不能使用virtual、static 和private修饰符。
抽象方法声明引入了一个新方法,但不提供该方法的实现。由于抽象方法不提供任何实际实现,因此抽象方法的方法体只包含一个分号。
当从抽象类派生一个非抽象类时,需要在非抽象类中重写抽象方法,以提供具体的实现。重写抽象方法时使用override关键字。

接口是一种特殊的抽象类,这种抽象类中指定实现该接口的类必须提供的成员,实现接口的类提供接口成员的实现。通过接口可以实现不相关类的相同行为,而不需要考虑这些类之,间的层次关系。接口特性如下:
1)通过接口可以指明多个类需要实现的方法。
2)接口类似于抽象基类: 继承接口的任何非抽象类型都必须实现接口的所有成员。
3)不能直接实例化接口。
4)接口可以包含事件、索引器、方法和属性。
5)接口不包含方法的实现。
6)类和结构可从多个接口继承。
7)接口自身可从多个接口继承。

如果类实现两个接口,并且这两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为它们的实现;然而,如果两个接口成员实现不同的功能,那么这可能会导致其中一个接口的实现不正确或两个接口的实现都不正确。这时可以显式地实现接口成员,即创建一个仅通过该接口调用并且特定于该接口的类成员。显式接口成员实现是使用接口名称和一个句点命名该类成员来实现的。

显式接口成员实现中不能包含访问修饰符、abstract. virtual. override 或static 修饰符。
显式接口成员是属于接口的成员,而不是类的成员,因此不能使用类对象直接访问,只能通过接口对象来访问。

抽象类和接口的区别:
抽象类和接口都包含可以由派生类继承的成员,它们都不能直接实例化,但可以声明其变量。如果这样做,就可以基于多态性把继承这两种类型的对象指定给它们的变量,接着通过这些变量来使用这些类型的成员,但不能直接访问派生类中的其他成员。

抽象类和接口的区别主要有以下几点:
1、它们的派生类只能继承一个基类,即只能直接继承一个抽象类,但可以继承任意多个接口。
2、抽象类中可以定义成员的实现,但接口中不可以。
3、抽象类中可以包含字段、 构造函数、析构函数、静态成 员或常量等,但接口中不可以。
4、抽象类中 的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(受保护的内部成员只能在应用程序的代码或派生类中访问),但接口中的成员必须是公共的。

密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。密封可以防止对库的类型和成员进行自定义,但也会影响某些开发人员对可用性的认识。
在C#中使用密封类时,如果类满足如下条件,则应将其密封。
类是静态类。
类包含带有安全敏感信息的继承的受保护成员。
类继承多个虚成员, 并且密封每个 成员的开发和测试开销明显大于密封整个类。
类是一个要求使用反射进行快速搜索的属性,密封属性可提高反射在检索属性时的性能。

1、密封类不能作为基类被继承,但它可以继承别的类或接口。
2、在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。
3、由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed 修饰符不能与abstract修饰符同时使用。

posted @ 2020-12-20 12:13  ErShiXiong  阅读(718)  评论(0编辑  收藏  举报