如何防止派生类中某些方法或属性的继承?!
public class BaseClass : Collection
{
//Some operations...
//Should not let derived classes inherit 'Add' method.
}
public class DerivedClass : BaseClass
{
public void DoSomething(int Item)
{
this.Add(Item); // Error: No such method should exist...
}
}
答案 0 :(得分:18)
您想要的模式是合成(“Has-a”),而不是继承(“Is-a”)。 BaseClass应该包含一个集合,而不是从集合继承。然后,BaseClass可以选择性地选择在其接口上公开的方法或属性。其中大部分可能只是调用内部集合中等效方法的直通。
在子类中标记私有内容是行不通的,因为任何具有基类型变量(Collection x = new DerivedClass()
)的人仍然可以通过基类型访问“隐藏”成员。
如果“Is-a”vs“Has-a”没有为您点击,请从父母与朋友的角度来考虑。您不能选择您的父母,也不能将其从您的DNA中删除,但您可以选择与之相关的人。
答案 1 :(得分:8)
你不能,在这种情况下,继承是工作的错误工具。您的课程需要将该集合作为私人成员,然后您可以根据需要公开尽可能多的内容。
答案 2 :(得分:1)
尝试在派生类中隐藏类的公共成员通常是一件坏事(*)。试图隐藏它作为确保它不会被调用的手段更糟糕,并且通常无论如何都无法工作。
我知道没有任何标准化的惯用手段来阻止父类的受保护成员以子派生类型进行访问,但声明一个明显无用的新公共无用成员将是一种方法。最简单的事情就是空洞。例如,如果类Foo声明一个名为MemberwiseClone的空公共类,则Foo的派生将无法调用MemberwiseClone - 如果MemberwiseClone会破坏类Foo的不变量,这可能是一件好事。
(*)唯一合适的情况是派生类的公共方法返回比基类中相应方法更专用的类型(例如,CarFactory.Produce()方法可能返回Car,而FordExplorerFactory.Produce()方法可能会返回一个FordExplorer(它来自汽车)。有人调用Produce()他们认为是一个CarFactory(但碰巧是一个FordExplorerFactory)会得到一辆Car(恰好是一辆FordExplorer) ),但是在编译时将Produce()调用为FordExplorerFactory的人将得到一个在编译时被称为FordExplorer的结果。