1.什么样的类不能被继承,什么样的类不能被实例化?
    sealed密封类,static静态例程类不能被继承,abstract抽象类不能被实例化.另外构造函数访问级别为"私有"的类,不能用new来在外部实例化.

2.继承的缺陷
    继承会打破封装,并总是会提高耦合度.在基类有受保护字段的情况下使用封装的时候,就是在打破封装,在暴露基类的内部状态,这是不好的.许多人把继承描述为白盒重用.更好的一种重用方式是黑盒重用,即对象的内部状态不暴露出来.黑盒重用可以通过包含来实现,新类不继承自其他类,而是包含一个其他类的实例,这样可以不打破封装而重用包含的类型.

点击(此处)折叠或打开

  1. public class NetworkCommunicator
  2. {
  3.   public void sendData(DataObject obj)
  4.   {
  5.     //Send the data over the wire.

  6.   }
  7.    
  8.   public DataObject ReceiveData()
  9.   {
  10.     //Receive data over the wire.

  11.   }
  12. }


  13. public class EncryptedNetworkCommunicator
  14. {
  15.   public EncryptedNetworkCommunicator()
  16.   {
  17.     contained = new NetworkCommunicator();
  18.   }

  19.   public void SendData(DataObject obj)
  20.   {
  21.     //Encrypt the data.

  22.     contained.SendData(obj);
  23.   }

  24.   public DataObject ReceiveData()
  25.   {
  26.     DataObject obj = contained.ReceiveData();
  27.     //Decrypt data

  28.     return obj;
  29.   }

  30.   private NetworkCommunicator contained;
  31. }
通过上面的代码可以看到,就是多了一点点工作.但是带来的好处就是,可以像黑盒子那样重用NetworkCommunicator.即使NetworkCommunicator的设计者把它设计成了密封的,你也还可以通过包含重用它,当通过重用包含来重用NetworkCommunicator时,你可以在容器上提供一个公共接口.这个接口看起来和NetworkCommunicator实现的接口有细微的区别.这个技术通常被称为Facade模式.
    使用继承的另一个缺点就是它不是动态的,因为它是在编译时决定的.

3.接口的实现
(1) 隐式接口的实现
    当一个具体类型实现其所继承接口中的方法,并且这些方法标记为public的,这称为隐式接口实现.下面为隐式接口的例子:

点击(此处)折叠或打开

  1. public interface IUIControl
  2. {
  3.   void Paint();
  4. }

  5. public class StaticText : IUIControl
  6. {
  7.   public void Paint();
  8. }
(2) 显式接口实现
    当一个具体类型隐式地实现一个接口,那些接口方法也成为了具体类型自身公共契约的一部分.然而,你也许并不总是希望接口方法实现成为实现了此接口的类的公共契约的一部分.比如说,类System.IO.FileStream实现了接口IDisposable,但不能通过FileStream的实例调用Dispose方法.而必须首先将指向FileStream对象的引用转型为一个IDisposable接口,然后,才可以调用Dispose方法.当你在自己定义的类型中需要这种行为的时候,必须使用显式接口实现的方法来实现这些接口.你也可以使用显式接口实现来为继承接口中重叠的方法提供独立的实现.显式接口实现如下所示:

点击(此处)折叠或打开

  1. using System;

  2. public interface IUIControl
  3. {
  4.   void Paint();
  5. }

  6. public interface IEditBox : IUIControl
  7. {
  8.   new void Paint();
  9. }

  10. public interface IDropList : IUIControl
  11. {
  12. }

  13. public class ComboBox : IEditBox, IDropList
  14. {
  15.   void IEditBox.Paint()
  16.   {
  17.     Console.WriteLine("ComboBox.IEditBox.Paint()");
  18.   }
  19.   
  20.   void IUIControl.Paint()
  21.   {
  22.     Console.WriteLine("ComboBox.IUIControl.Paint()");
  23.   }

  24.   public void Paint()
  25.   {
  26.     ((IUIControl)this).Paint();
  27.   }
  28. }

  29. public class EntryPoint
  30. {
  31.   static void Main()
  32.   {
  33.     ComboBox cb = new ComboBox();
  34.     cb.Paint();
  35.     ((IEditBox)cb).Paint();
  36.     ((IDropList)cb).Paint();
  37.     ((IUIControl)cb).Paint();
  38.   }
  39. }


09-12 12:27