如何在子类中隐藏父类属性。
父类具有名为“Parent”的属性,其中我不想在子类中使用它。我该如何删除或隐藏它。
答案 0 :(得分:11)
所以听起来你问的是以下内容。
class Parent {
public SomeType ParentProperty { get; set; }
}
class Child : Parent { }
并且您希望隐藏SomeProperty
在Child
的实例中不可见。
不要这样做!不要隐藏可见的基类属性。首先,它很容易解决:
Parent p = new Child();
p.ParentProperty; // oops!
其次,这是对Liskov substitution principle的严重违反。基本上,该原则表明,对于Parent
的所有实例,您知道的所有Child
实例都应该是真实的。Parent
。在这里,我们知道ParentProperty
的所有实例都有一个名为SomeType
Child
的可见属性。因此,对于{{1}}的所有实例都应该(道德应该)成立。
您能告诉我们您为什么要这样做,也许我们可以建议一个替代方案吗?
答案 1 :(得分:2)
别。
如果需要,您有设计问题。 Liskov Substitution Principle告诉您Child
类应该可以替代Parent
类。这意味着使用Parent
类的所有代码都应该能够使用您的Child
类。如果要删除属性,则不是这种情况。无论在何处使用该特定属性,都无法将父项替换为子项。
答案 2 :(得分:2)
我想明显的问题/答案是,也许你应该把这个属性私有化。 (当然,除非您无法访问源代码)
答案 3 :(得分:1)
希望这个帮助,您可以隐藏属性并将其设置为只读:)
答案 4 :(得分:0)
如果你在上课时上课,那么幸运的是,没有办法让它成为一种方式。为什么那会是一个糟糕的故事,看看这段代码:
base myObj = objectFactory.Create(); myObj.theMethodHiddenAway();
工厂可以返回任何类型为base的对象,包括从base派生的所有类。编译器需要决定什么版本的theMethodHiddenAway来调用编译时间(重载结果),因为它没有具体的类型编译时间,如果有可能通过继承使方法消失,编译器就不会知道theMethodHiddenAway甚至存在。
我建议你看看你的设计,因为你要问的是两个设计缺陷之一。要么方法不属于第一位,要么派生类不应该从基类继承
答案 5 :(得分:0)
你做不到。子类引用始终可以隐式转换为父类引用,因此无法阻止该属性从父类中删除它。