跨越这句话刚来到在一本书上说OOP我读

  

一个子只允许增加   功能和添加功能。   孩子是绝不允许删除   功能。如果你发现一个   孩子需要删除的功能,   这是一个迹象表明孩子   在家长面前应该出现   继承层次结构!

不过,我的问题是,是不是这是什么压倒一切的呢?

有帮助吗?

解决方案

可以与重写删除功能。但通常你用它来改变行为。让类表现为它应该是

如果行为被删除那么它是非常经常不好类设计的标志。

其他提示

这孩子不能删除的功能 - 它可以改变它,但你不能,比如说,让一个公共方法私有

继承的一点是,你可以处理孩子,就好像它是父。如果你有一个“人”超类“雇员”的子类,这将毫无意义Employee类已经没有呼吸()方法。

当重写的方法,也能够打电话给你超控期间在一些点父类的实现,因此,使用超控功能添加到父类的实现。

没有。其实你会被增强功能(以消极的方式)

让我们说你的新功能是“什么也不做”,但该方法,你的代码看的的客户的是什么仍然是相同的接口

可以不具有子类,除去它的父的方法。

这是可能的

class Parent {
    public void method_one(){ 
        print "Hello";
    }
}

class Child extends Parent {
     public void method_one(){
         // do nothing
     }
 }

但是,这不是:

class Parent {
    public void method_one(){ 
        print "Hello";
    }
}

class Child extends Parent {
     // Attempt remove the method visibility, thus remove funcionality 
     private void method_one(){ 
         // do nothing
     }
 }

这就是为什么还挺覆盖(在一般情况下,任何虚拟成员)是应该非常仔细地做... 事实上,通常,覆盖时,你应该尝试编写两个基类和派生类,使派生类的实现首先调用基实现,然后执行它的附加功能......

但这个原则没有在面向对象的语言执行,而常常受到侵犯......

的为什么这是不好的实施例

假设你有公司A设计类型(类)电话

namespace CompanyA {
   class Phone {
       public void Dial() {
        // do work to dial the phone here
       }
   }
}

没有iagine公司B定义了另一个类型BetterPhone,使用A公司的电话作为碱型...

namespace CompanyB {
   class BetterPhone: CompanyA.Phone {
       public void Dial()  {
           Console.WriteLine("BetterPhoneDial");
           EstablishConenction();
           base.Dial();
       }
   }
}

现在公司A,其电话类是在由其它公司(公司C,d等)决定建立连接是在类一个有用的东西,并修改CompanyA.Phone,加入EsatblishCOnnection使用()方法为好,也许不同的实现......直到我们有了“新”的关键字,这种情况下就已经打破CompanyB的BetterPhone类......他们第一次尝试使用新的基类。

如果您的孩子需要删除父的功能,那么家长必须声明为接口。 因为接口是机构,它定义了必须通过其实现者遵守合同。

E.g。


public interface IContract
{
  void DoWork();
}

public class BaseContract: IContract
{
 public virtual void DoWork()
 {
  //perform operation A
 }
}

现在,如果你想声明新EnhancedContract类,你可以得到它无论是从BaseContract或IContract取决于需求。 如果要执行其他操作,以碱的操作的,则可以从BaseContract继承它如下所示。


public class EnhancedContract: BaseContract
{
  public override void DoWork()
  {
   //perform operation B
   base.DoWork();
   //perform operation C
  }
}

但如果你不感兴趣EnhancedContract的DoWork的方法做操作的,那么自IContract继承它。

这确保EnhancedWork将执行DoWork的(),但它不能保证在它做“操作A”。


public class EnhancedWork:IContract
{
  public void DoWork()
  {
   //perform operation D
  }
}

此,因为它会从做下面铸造停止用户为understading重要。


EnhancedContract e = new EnhancedContract();
BaseContract b = e;

我相信所有的这些操作是很重要的,同时了解开闭原则 里氏替换原则

继承拇指规则是“把附加功能到现有的一个”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top