如何从子类隐藏父属性

时间:2010-01-29 14:02:27

标签: c# oop inheritance

如何在子类中隐藏父类属性。

父类具有名为“Parent”的属性,其中我不想在子类中使用它。我该如何删除或隐藏它。

6 个答案:

答案 0 :(得分:11)

所以听起来你问的是以下内容。

class Parent {
    public SomeType ParentProperty { get; set; }
}

class Child : Parent { }

并且您希望隐藏SomePropertyChild的实例中不可见。

不要这样做!不要隐藏可见的基类属性。首先,它很容易解决:

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)

你做不到。子类引用始终可以隐式转换为父类引用,因此无法阻止该属性从父类中删除它。