继承,亲子和压倒一切
-
11-07-2019 - |
题
跨越这句话刚来到在一本书上说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;
我相信所有的这些操作是很重要的,同时了解开闭原则 里氏替换原则。
继承拇指规则是“把附加功能到现有的一个”。