none
纯面向对象理论讨论,下面这段代码有没有错? RRS feed

  • 问题

  •  public class a{public void f1(){}}
    public class b :a{public void f2(){}} 
    如果使用这样对,那么代换原则就受到破坏,如果不可以,怎么在子类添加新行为?

    2012年11月17日 8:40

答案

  • 你完全可以这样改:

    1)提取A,B的公共类C弄成一个抽象类,然后分别让A和B继承这个类(这样,A和B分别可以添加自己独特的行为)。

    2)把A作为引用而非继承,譬如:

    public class A
    {
    public void f1(){}
    }
    public class b 
    {
     private A a = new A();
     public void f2()
     {
       a.f1();
       //这里是f2自己的方法……
     }
    } 

    不建议直接从一个类直接继承另外一个类,一般考虑引用而非直接继承。

    不过从NET3.5开始,你或许可以考虑扩展方法:

    public static class ExtendB
    {
      public static void FunB(this B b)
      {
        ………………
      } 
    }
    
    //你这样做
    B b = new B();
    b.FunB();

    关于扩展方法,你可以参考:

    http://msdn.microsoft.com/zh-cn/library/bb383977.aspx


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年11月17日 9:22
    版主
  • dear

    当然可以添加行为。

    我所理解的里氏替换原则,是指父类能出现的地方,子类就可以出现;反之,子类能出现的地方,父类未必能适应,因子类已经实作父类的属性和方法,可能也扩充了父类所没有的功能。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月30日 3:14

全部回复

  • 你完全可以这样改:

    1)提取A,B的公共类C弄成一个抽象类,然后分别让A和B继承这个类(这样,A和B分别可以添加自己独特的行为)。

    2)把A作为引用而非继承,譬如:

    public class A
    {
    public void f1(){}
    }
    public class b 
    {
     private A a = new A();
     public void f2()
     {
       a.f1();
       //这里是f2自己的方法……
     }
    } 

    不建议直接从一个类直接继承另外一个类,一般考虑引用而非直接继承。

    不过从NET3.5开始,你或许可以考虑扩展方法:

    public static class ExtendB
    {
      public static void FunB(this B b)
      {
        ………………
      } 
    }
    
    //你这样做
    B b = new B();
    b.FunB();

    关于扩展方法,你可以参考:

    http://msdn.microsoft.com/zh-cn/library/bb383977.aspx


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年11月17日 9:22
    版主
  • dear

    当然可以添加行为。

    我所理解的里氏替换原则,是指父类能出现的地方,子类就可以出现;反之,子类能出现的地方,父类未必能适应,因子类已经实作父类的属性和方法,可能也扩充了父类所没有的功能。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月30日 3:14