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

CJ7*_*CJ7 26 c# oop inheritance

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

例如,如果我不希望我的班级有一个ToString()方法,我可以做一些让它不再可用的东西吗?

Jon*_*eet 33

不 - 这会违反利斯科夫的替代原则.您应始终能够使用子类型的实例,就好像它是超类型的实例一样.

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

object foo = new TypeWithToStringRemoved();
foo.ToString();
Run Code Online (Sandbox Code Playgroud)

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

现在ToString,GetHashCode,EqualsGetType有没有办法避免让他们摆在首位-但通常如果有你想从一个基础类型为"删除"的方法,即意味着你不应该从它摆在首位继承.就个人而言,我发现继承的作用在面向对象编程中有些过分:它很有用它真的很有用,但通常我更喜欢组合而不是继承,接口作为抽象形式而不是基类.


tan*_*ius 18

您可以抛出NotSupportedException,将其标记为已过时并使用EditorBrowsable:

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

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

  • 如果你真的想禁用该方法,那么执行 `[Obsolete( "...", true )]` 不是更好吗?然后调用该方法是一个编译器错误,不需要异常。 (3认同)

R0M*_*RMY 6

正如其他人指出的那样,你不能"删除"一个方法,但如果你觉得它以某种方式冤枉了你,你可以将它隐藏在派生类中.

来自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
}
Run Code Online (Sandbox Code Playgroud)