2008-11-28 70 views
1

跨越这句话刚来到在一本书上说OOP我读,继承,亲子和压倒一切的

一个孩子只允许增加 功能和添加功能。 小孩绝不允许删除 功能。如果您发现子女需要删除功能 ,这表示子女 应该出现在继承层次结构的父级之前!

但我的问题是,这不是什么压倒一切吗?

回答

4

您可以通过覆盖删除功能。但通常你用它来改变行为。让班级按照应有的方式行事。

如果行为被删除,那么它往往是一个糟糕的类设计的标志。

+0

所以真的在C#中,一切都从system.object继承,是否正确?你可以改变system.object中方法的行为,或者你不使用它们,但是你永远不会删除它们。 – GregD 2008-11-28 21:35:26

+0

并非总是如此。那么NullObjectPattern :) – OscarRyz 2008-11-28 21:35:52

+0

C#有这样的事情吗?请记住,我是一名初学者。在我看来,null仍然是*某种东西*,尽管它代表了一个对象的缺席。这仍然是一些东西的定义。 – GregD 2008-11-28 21:40:22

1

覆盖方法时,可能会在覆盖期间的某个时刻调用父实现,因此使用覆盖向父实现添加功能。

3

孩子无法删除功能 - 它可以改变它,但你不能说公开私有方法。

继承的一点是,您可以像处理父母一样处理孩子。如果你的'Person'超类是'Employee'子类,那么Employee类没有呼吸()方法是没有意义的。

0

这就是为什么重写(以及一般来说,任何虚拟成员)应该非常仔细地做... 事实上,通常,当重写时,您应该尝试编码基类和派生类,使派生类的实现首先调用基实现,然后执行它的附加功能......

,但这一原则是不是在面向对象的语言执行,而常常受到侵犯......的

例为什么这是不好的

想象一下,你有CompanyA设计类型(类)电话

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类...他们第一次尝试使用新的基类。

1

No.其实你会被增强功能(以消极的方式)

比方说,你的新功能是“什么也不做”,但法,什么客户代码的看还是一样接口

您不能拥有删除其父项方法的子类。

这是可能的

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 
    } 
} 
0

如果你的孩子需要删除父的功能,那么家长必须声明为接口。 因为接口是定义必须遵守实现者的契约的机制。

E.g.

 

public interface IContract 
{ 
    void DoWork(); 
} 

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

现在,如果你想声明新EnhancedContract类,你可以从BaseContract或IContract派生它取决于需求。 如果您想对基地的操作A执行附加操作,则可以从BaseContract继承它,如下所示。

 

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

但是,如果您对在EnhancedContract的DoWork方法中执行操作A没有兴趣,则从IContract继承它。

这确保了EnhancedWork将执行DoWork(),但不保证在其中执行'操作A'。

 

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

这对于视频下载非常重要,因为它会阻止用户在下面的视频中执行操作。

 

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

我相信所有的这些操作是很重要的,同时了解Open Closed principleLiskov substitution principle

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