隐藏继承类中的虚函数

时间:2011-03-19 10:26:23

标签: c# oop inheritance

我有一个继承自LinkButton的课程,我希望隐藏OnClinentClick课程。

像这样:

public class MyClass : LinkButton
{
    // some Code
}

代码中的某处:

MyClass myclass = new MyClass();
MyClass.OnClinentClick = "";//this line must not be accessable

4 个答案:

答案 0 :(得分:6)

不会直接支持隐藏类定义中的某些内容,因为它违反了OOP原则。

您可以使用new运算符,但我不会建议。就个人而言,如果没有别的办法,我会考虑我的设计和/或使用NotSupportedException

答案 1 :(得分:4)

您可以使用EditorBrowsableAttribute来阻止IntelliSense建议它,但您无法完全摆脱它。

[EditorBrowsable(EditorBrowsableState.Never)]
public virtual string OnClientClick { get; set; }

C#仅支持公共继承。您不应继承其方法对所有派生类没有意义的类。考虑组合而不是继承来解决此问题。

答案 2 :(得分:0)

如何降低能见度。 protectedinternal中的一个可能是您想要的。当然,这不会从派生类中删除这样的成员,只是将它们从公共接口中删除。它还需要控制基类。不知道LinkButton是否属于您的班级之一。

您也可以通过重新引入具有相同属性的新属性来隐藏该属性。但这是一个坏主意,回到基类允许外人访问它。

你应该考虑使用has-a关系而不是is-a。即如果您不想要所有公共成员,请不要从基类派生。这违反了OOP原则,例如应该可以替换期望基类的派生类。

您也可以覆盖它,并使设置者抛出NotSupportedException。但这也很难看,因为它只会在运行时而不是编译时显示错误。您可以使用ObsoleteAttribute等属性生成编译时警告。

答案 3 :(得分:0)

你可以覆盖这个函数(也就是说,只要前者是虚拟的,就用你的函数替换基础实现),但是如果用{{1隐藏它们,则不能完全阻止客户端调用基类函数因为它们可能总是强制转换为基类。

更新:
实际上,在覆盖时,您无法将访问权限从公共更改为受保护/私有,这将无法编译(http://ideone.com/Y65Uh)。除此之外,如果使用new隐藏基本函数并使其不可调用,原始函数仍然可见(http://ideone.com/xiL2F)。如果您将新函数声明为public(可能不是您想要的),则仍可以通过强制转换为基类(http://ideone.com/A3Bji)来调用旧函数。