如何防止某些方法的inheritance?

如何防止派生类中某些方法或属性的inheritance?!

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

你想要的模式是组合(“Has-a”),而不是inheritance(“Is-a”)。 BaseClass应该包含一个集合,而不是从集合inheritance。 然后,BaseClass可以选择性地选择在其接口上公开的方法或属性。 其中大多数可能只是调用内部集合上的等效方法的passthroughs。

在子类中标记私有内容是行不通的,因为任何具有基类型变量( Collection x = new DerivedClass() )的人仍然可以通过基类型访问“隐藏”成员。

如果“Is-a”vs“Has-a”没有为您点击,请从父母与朋友的角度来考虑。 您不能选择父母,也不能将其从DNA中删除,但您可以选择与之相关的人。

你不能,在这种情况下,inheritance是工作的错误工具。 您的类需要将集合作为私有成员,然后您可以根据需要公开尽可能多的内容。

试图在派生类中隐藏类的公共成员通常是一件坏事(*)。 试图隐藏它作为确保它不会被调用的手段更糟糕,并且通常无论如何都无法工作。

我知道没有任何标准化的惯用手段可以防止父类的受保护成员以子派生类型被访问,但是声明一个明显无用的新公共无用成员将是一种方法。 最简单的事情就是空洞。 例如,如果类Foo声明一个名为MemberwiseClone的空公共类,则Foo的派生将无法调用MemberwiseClone – 如果MemberwiseClone会破坏类Foo的不变量,这可能是件好事。

(*)唯一合适的情况是派生类的公共方法返回比基类中相应方法更专用的类型(例如,CarFactory.Produce()方法可以返回Car,而FordExplorerFactory。 Produce()方法可能会返回一个FordExplorer(它来自汽车)。在他们认为是CarFactory(但碰巧是一个FordExplorerFactory)上调用Produce()的人会得到一辆Car(恰好是FordExplorer),但是在编译时将Produce()调用为FordExplorerFactory的人将得到一个在编译时被称为FordExplorer的结果。