【问题标题】:How to prevent inheritance for some methods?如何防止某些方法的继承?
【发布时间】:2011-04-15 21:34:05
【问题描述】:
如何防止继承派生类中的某些方法或属性?!
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...
}
}
【问题讨论】:
标签:
c#
oop
class
inheritance
【解决方案1】:
试图在派生类中隐藏类的公共成员通常是一件坏事(*)。试图隐藏它以确保它不会被调用更糟糕,而且通常无论如何都不会起作用。
据我所知,没有任何标准化的惯用方法可以防止父类的受保护成员在子派生类型中被访问,但声明一个明显无用的新公共无用成员将是一种方法。最简单的事情是一个空类。例如,如果类 Foo 声明了一个名为 MemberwiseClone 的空公共类,则 Foo 的派生类将无法调用 MemberwiseClone——如果 MemberwiseClone 会破坏类 Foo 的不变量,这可能是一件好事。
(*) 唯一合适的情况是派生类的公共方法返回比基类中的相应方法更专业的类型(例如 CarFactory.Produce() 方法可能返回 Car,而FordExplorerFactory.Produce() 方法可能会返回一个 FordExplorer(它派生自 car)。有人在他们认为是 CarFactory(但恰好是 FordExplorerFactory)上调用 Produce() 将得到一辆 Car(恰好是 FordExplorer ),但是在编译时调用 Produce() 的人将得到一个在编译时已知为 FordExplorer 的结果。
【解决方案2】:
您想要的模式是组合(“Has-a”),而不是继承(“Is-a”)。 BaseClass 应该包含一个集合,而不是从集合继承。然后 BaseClass 可以有选择地选择要在其接口上公开的方法或属性。其中大部分可能只是调用内部集合上的等效方法的传递。
在子类中将内容标记为私有将不起作用,因为任何拥有基类型变量 (Collection x = new DerivedClass()) 的人仍然可以通过基类型访问“隐藏”成员。
如果“Is-a”与“Has-a”没有为您所用,请从父母与朋友的角度来考虑。你无法选择你的父母,也无法将他们从你的 DNA 中移除,但你可以选择与谁交往。
【解决方案3】:
你不能,在这种情况下,继承是工作的错误工具。您的类需要将集合作为私有成员,然后您可以根据需要尽可能多地公开它。