跨越这句话刚来到在一本书上说OOP我读,继承,亲子和压倒一切的
一个孩子只允许增加 功能和添加功能。 小孩绝不允许删除 功能。如果您发现子女需要删除功能 ,这表示子女 应该出现在继承层次结构的父级之前!
但我的问题是,这不是什么压倒一切吗?
跨越这句话刚来到在一本书上说OOP我读,继承,亲子和压倒一切的
一个孩子只允许增加 功能和添加功能。 小孩绝不允许删除 功能。如果您发现子女需要删除功能 ,这表示子女 应该出现在继承层次结构的父级之前!
但我的问题是,这不是什么压倒一切吗?
您可以通过覆盖删除功能。但通常你用它来改变行为。让班级按照应有的方式行事。
如果行为被删除,那么它往往是一个糟糕的类设计的标志。
覆盖方法时,可能会在覆盖期间的某个时刻调用父实现,因此使用覆盖向父实现添加功能。
孩子无法删除功能 - 它可以改变它,但你不能说公开私有方法。
继承的一点是,您可以像处理父母一样处理孩子。如果你的'Person'超类是'Employee'子类,那么Employee类没有呼吸()方法是没有意义的。
这就是为什么重写(以及一般来说,任何虚拟成员)应该非常仔细地做... 事实上,通常,当重写时,您应该尝试编码基类和派生类,使派生类的实现首先调用基实现,然后执行它的附加功能......
,但这一原则是不是在面向对象的语言执行,而常常受到侵犯......的
例为什么这是不好的
想象一下,你有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类...他们第一次尝试使用新的基类。
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
}
}
如果你的孩子需要删除父的功能,那么家长必须声明为接口。 因为接口是定义必须遵守实现者的契约的机制。
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 principle,Liskov substitution principle。
继承的拇指规则是“将附加功能添加到现有的一个”。
所以真的在C#中,一切都从system.object继承,是否正确?你可以改变system.object中方法的行为,或者你不使用它们,但是你永远不会删除它们。 – GregD 2008-11-28 21:35:26
并非总是如此。那么NullObjectPattern :) – OscarRyz 2008-11-28 21:35:52
C#有这样的事情吗?请记住,我是一名初学者。在我看来,null仍然是*某种东西*,尽管它代表了一个对象的缺席。这仍然是一些东西的定义。 – GregD 2008-11-28 21:40:22