有没有办法让一个类“删除”它继承的方法?

时间:2010-05-06 07:06:38

标签: c# inheritance oop

有没有办法让一个类“删除”它继承的方法?

E.g。如果我不希望我的班级有ToString()方法,我可以做一些事情,以便它不再可用吗?

4 个答案:

答案 0 :(得分:32)

不 - 这会违反Liskov's Substitution Principle。您应始终能够使用子类型的实例,就像它是超类型的实例一样。

不要忘记调用者可能只知道您的类型“作为”基本类型或接口。请考虑以下代码:

object foo = new TypeWithToStringRemoved();
foo.ToString();

那必须编译,不是吗?现在你期望在执行时发生什么?

现在,对于ToStringGetHashCodeEqualsGetType,首先无法避免让它们出现 - 但通常情况下,如果有方法需要“从基本类型中删除“,这表明您不应该首先从它继承。就个人而言,我发现继承的作用在面向对象编程中有点过分:有用它的真正有用,但通常我更喜欢组合而不是继承,接口是抽象形式而不是基类。 / p>

答案 1 :(得分:18)

您可以抛出NotSupportedException,将其标记为Obsolete并使用EditorBrowsable

[EditorBrowsable( EditorBrowsableState.Never )]
[Obsolete( "...", false )]
void YourMethod()
{
    throw new NotSupportedException( "..." );
}

修改
正如其他人所指出的:我描述了一种“禁用”方法的方法,但你必须仔细考虑,在哪里使用它。特别是抛出异常可能是一件非常危险的事情。

答案 2 :(得分:5)

正如其他人指出的那样,你不能“删除”某个方法,但如果你觉得它以某种方式冤枉了你,你可以在派生类中hide it

来自Microsoft的文档(现已退休):

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
}

答案 3 :(得分:1)

简短回答,不是,因为所有类都从对象和对象继承了这个方法。