sealed密封类,static静态例程类不能被继承,abstract抽象类不能被实例化.另外构造函数访问级别为"私有"的类,不能用new来在外部实例化.
2.继承的缺陷
继承会打破封装,并总是会提高耦合度.在基类有受保护字段的情况下使用封装的时候,就是在打破封装,在暴露基类的内部状态,这是不好的.许多人把继承描述为白盒重用.更好的一种重用方式是黑盒重用,即对象的内部状态不暴露出来.黑盒重用可以通过包含来实现,新类不继承自其他类,而是包含一个其他类的实例,这样可以不打破封装而重用包含的类型.
点击(此处)折叠或打开
- public class NetworkCommunicator
- {
- public void sendData(DataObject obj)
- {
- //Send the data over the wire.
- }
-
- public DataObject ReceiveData()
- {
- //Receive data over the wire.
- }
- }
- public class EncryptedNetworkCommunicator
- {
- public EncryptedNetworkCommunicator()
- {
- contained = new NetworkCommunicator();
- }
- public void SendData(DataObject obj)
- {
- //Encrypt the data.
- contained.SendData(obj);
- }
- public DataObject ReceiveData()
- {
- DataObject obj = contained.ReceiveData();
- //Decrypt data
- return obj;
- }
- private NetworkCommunicator contained;
- }
使用继承的另一个缺点就是它不是动态的,因为它是在编译时决定的.
3.接口的实现
(1) 隐式接口的实现
当一个具体类型实现其所继承接口中的方法,并且这些方法标记为public的,这称为隐式接口实现.下面为隐式接口的例子:
点击(此处)折叠或打开
- public interface IUIControl
- {
- void Paint();
- }
- public class StaticText : IUIControl
- {
- public void Paint();
- }
当一个具体类型隐式地实现一个接口,那些接口方法也成为了具体类型自身公共契约的一部分.然而,你也许并不总是希望接口方法实现成为实现了此接口的类的公共契约的一部分.比如说,类System.IO.FileStream实现了接口IDisposable,但不能通过FileStream的实例调用Dispose方法.而必须首先将指向FileStream对象的引用转型为一个IDisposable接口,然后,才可以调用Dispose方法.当你在自己定义的类型中需要这种行为的时候,必须使用显式接口实现的方法来实现这些接口.你也可以使用显式接口实现来为继承接口中重叠的方法提供独立的实现.显式接口实现如下所示:
点击(此处)折叠或打开
- using System;
- public interface IUIControl
- {
- void Paint();
- }
- public interface IEditBox : IUIControl
- {
- new void Paint();
- }
- public interface IDropList : IUIControl
- {
- }
- public class ComboBox : IEditBox, IDropList
- {
- void IEditBox.Paint()
- {
- Console.WriteLine("ComboBox.IEditBox.Paint()");
- }
-
- void IUIControl.Paint()
- {
- Console.WriteLine("ComboBox.IUIControl.Paint()");
- }
- public void Paint()
- {
- ((IUIControl)this).Paint();
- }
- }
- public class EntryPoint
- {
- static void Main()
- {
- ComboBox cb = new ComboBox();
- cb.Paint();
- ((IEditBox)cb).Paint();
- ((IDropList)cb).Paint();
- ((IUIControl)cb).Paint();
- }
- }