一个类是否有办法“删除”它继承的方法?
例如,如果我不希望我的类有一个ToString()
方法,我能否做某些事情使其不再可用?
一个类是否有办法“删除”它继承的方法?
例如,如果我不希望我的类有一个ToString()
方法,我能否做某些事情使其不再可用?
object foo = new TypeWithToStringRemoved();
foo.ToString();
希望它能编译,不是吗?那么在执行时你会期望发生什么?
对于ToString、GetHashCode、Equals和GetType,没有办法避免它们出现 - 但通常,如果有一些方法你想要从一个基类型中“删除”,那就意味着你本来就不应该从它继承。个人认为,在面向对象编程中,继承的作用有些被夸大:当它有用时它确实非常有用,但通常我更喜欢组合而非继承,并且使用接口作为抽象的形式,而不是基类。
ToString()
方法抛出异常尤其危险。有很多比你展示的(直接调用)更为隐藏的 ToString()
使用方法。 - tanasciusnew
修饰符来隐藏一个继承的成员(并抛出一个NotSupportedException,就像tanascius建议的那样),而不会违反任何原则或引发意外异常。 - Allon Guralnek您可以抛出NotSupportedException,将其标记为Obsolete并使用EditorBrowsable:
[EditorBrowsable( EditorBrowsableState.Never )]
[Obsolete( "...", false )]
void YourMethod()
{
throw new NotSupportedException( "..." );
}
编辑:
正如其他人指出的那样:我描述了一种“禁用”方法的方法,但您必须仔细考虑您想在哪里使用它。特别是抛出异常可能是非常危险的事情。
[Obsolete("...", true)]
会更好吧?这样调用这个方法就会产生编译错误,不需要抛出异常。 - piedar正如其他人指出的那样,您无法“删除”一个方法,但如果您觉得它在某些方面对您造成了不利影响,您可以在派生类中隐藏它。
根据微软的文档(现已停用):
class Base
{
public static void F() {}
}
class Derived: Base
{
new private static void F() {} // Hides Base.F in Derived only
}
class MoreDerived: Derived
{
static void G() { F(); } // Invokes Base.F
}
简短回答,不行,因为所有类都继承自object类,而object类有这个方法。
virtual
(标记为virtual
,abstract
或override
),你很幸运,因为基类的作者允许你决定这个方法的行为。你可以让它什么也不做,或者抛出一个异常(但请注意,这可能会打破基类对你的方法的期望,所以在某些情况下会引入问题)。如果这个方法不是虚方法,你无能为力。用另一个方法来隐藏它是一个非常糟糕的想法(当然也不能删除它)。 - Jeppe Stig Nielsen