CJ7*_*CJ7 26 c# oop inheritance
有没有办法让一个类"删除"它继承的方法?
例如,如果我不希望我的班级有一个ToString()方法,我可以做一些让它不再可用的东西吗?
Jon*_*eet 33
不 - 这会违反利斯科夫的替代原则.您应始终能够使用子类型的实例,就好像它是超类型的实例一样.
不要忘记调用者可能只知道您的类型"作为"基本类型或接口.考虑以下代码:
object foo = new TypeWithToStringRemoved();
foo.ToString();
Run Code Online (Sandbox Code Playgroud)
那将不得不编译,不是吗?现在你期望在执行时发生什么?
现在ToString,GetHashCode,Equals和GetType有没有办法避免让他们摆在首位-但通常如果有你想从一个基础类型为"删除"的方法,即意味着你不应该从它摆在首位继承.就个人而言,我发现继承的作用在面向对象编程中有些过分:它很有用它真的很有用,但通常我更喜欢组合而不是继承,接口作为抽象形式而不是基类.
tan*_*ius 18
您可以抛出NotSupportedException,将其标记为已过时并使用EditorBrowsable:
[EditorBrowsable( EditorBrowsableState.Never )]
[Obsolete( "...", false )]
void YourMethod()
{
throw new NotSupportedException( "..." );
}
Run Code Online (Sandbox Code Playgroud)
编辑:
正如其他人所指出的:我描述了一种"禁用"方法的方法,但你必须仔细考虑,在哪里使用它.特别是抛出异常可能是一件非常危险的事情.
正如其他人指出的那样,你不能"删除"一个方法,但如果你觉得它以某种方式冤枉了你,你可以将它隐藏在派生类中.
来自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)