Visual Basic .NET Power Coding 读书笔记之第二章 继承和接口
一、 抽象类
抽象类和接口的关系非常紧密,都必须有要实现的成员。它们最大的区别是由抽象类可以派生出一些成员的实现,但接口却不包含任何成员的实现。当派生出的事物都属于同一个种类时,此时可用抽象类;当派生出的事物的功能要求完全不同的类对象时,就要用接口实现。
抽象类要求至少有一个抽象成员,抽象成员就是在派生类中必须被的成员。
抽象类使用关键字abstract声明。
虚方法也要使用关键字abstract声明。
重写方法和属性
在方法或属性上加上关键字override
调用基类方法
base.Method
替代方法和属性
有时需要阻止多态行为,或在基类中为某个类成员使用一个名称,而在派生类中却要以一种新的方式使用该名称,这称为“屏蔽”。可通过new修饰符实现。
二、 面向对象程序设计的几条基本规则
1、 保持少量的公共接口,大约6个左右的公共成员最适宜。
2、 许多类使用的是简单的接口,而不使用一些庞大复杂、能完成所有功能的方法。
3、 尽可能地使用私有方法来支持公共行为;强烈推荐多使用单值方法,少使用复杂庞大的方法(无论别人怎么说,最后这句是关键)。
4、 在了解更多系统需求的时候,如果感觉有错误就改正它。
5、 如果考虑到类的用户可能需要扩展类的行为,可使用protected和abstract修饰符。
有一些书籍建议读者在不知道如何重用泛化类时,一律把方法定义为受保护的虚方法,但这样会使得程序过于庞大,并且程序运行速度也会变慢)。
方法是用来创建新行为的。拥有越多的方法,就有更多的方式来组合这些方法。类是描述系统的实体。拥有的类越多,在描述系统时就具有更大的灵活性。如果系统出现错误,那么错误将较多地出现在那些受保护类型和私有类型的方法和类中,而较少地出现在公共方法中。复杂庞大的方法和子过程通常是一个系统不健全、扩展性不好的标志。
三、 继承与聚集
当从现有的基类派生一个新类时(也就是继承的时候),将得到这个基类所有成员的一个副本。这被称为“is-a”关系。
当一个类包含另外一个对象时,称为“包含”(containment)或者“聚集”(aggregation)。当根据被包含类的实现来定义容器类成员时,能使得容器类在其外观和行为上类似于被包含的类。聚集关系可称为一个“has-a”关系。
聚集能够完成一些和派生类相同的操作,但是不能通过“is-a”测试。
如果要想使派生类和父类具有相同的类型成员,则应选用继承;如果需要定义一个“整体-部分”的关系,也就是,被包含的对象是包含它的对象的一部分,则应选用聚集;如果需要改进被包含对象的接口,例如,当一个类有很多不符合需求的特征和公共成员时,则需要将现有的类包装在一个新类中,并仅使得符合新需求的那些成员可见。
四、 定义接口
接口定义了一种“契约”(contract)。确切地说,一个接口就是一个类型,它包括方法、属性、和事件的头部,但不包含实现代码。接口能够被继承及实现,其中继承是扩展这种契约的一种方法。
接口自身不能被创建,内容也不能被充实和给出实现代码。当.Net类接受一种接口契约时,类就必须实现接口定义的所有成员,这也是契约责任的关键。
1、 接口的基本准则
1) 接口定义方法、属性和事件签名,但不包含实现。
2) 接口可以执行任意类型的访问,即接口能够使用任何访问修饰符。接口的成员永远是公共的,不能用任何访问修饰符。
3) 接口可以嵌套。
4) 接口可以实现为共享的、抽象的或者虚成员。
5) 不能对接口成员附加安全属性。
6) 接口被看作恒定不变的,一旦您出于使用目的而发布了接口,就不应该改变这个接口。通常应该创建一个新的接口来扩展现有接口。
7) 与类一样,在接口中最好只定义几个关系紧密的成员,成员过多将使得接口变得笨重而难以使用。这样的接口称为“factoring”接口。
8) 用前缀“I”来区分接口和类,并且用Pascal命名方式(Pascal-casing)方式来命名接口(在Pascal命名方式中,每个单词的首字母大写,例:IMInterface)
9) 不能创建接口的实例。
五、 比较抽象类和接口
1、 抽象类可被部分实现,而接口需要完全实现。
2、 类支持单继承,接口支持多继承。
3、 如果继承一个抽象类,当你类更新时,所有的子类都会跟着更新;而接口是一成不变的,一旦发布了一个接口,永远不要再更改它。
4、 如果行为跨越不同类的对象,可使用接口。对于一些相似类的对象,用继承。
5、 使用接口来支持少量的附加功能,对于很多关联功能,可使用抽象类。
出处:http://stwyhm.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。