C# 如何对子类隐藏父属性

C# 如何对子类隐藏父属性,c#,oop,inheritance,C#,Oop,Inheritance,如何在子类中隐藏父类属性 父类有一个名为parent的属性,我不想在子类中使用它。我如何删除或隐藏它。所以听起来你在问以下问题。你有 class Parent { public SomeType ParentProperty { get; set; } } class Child : Parent { } 您希望隐藏某些属性,使其在子对象实例中不可见 不要这样做!不要对基类隐藏可见的属性。首先,四处走动很容易: Parent p = new Child(); p.ParentProp

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


父类有一个名为parent的属性,我不想在子类中使用它。我如何删除或隐藏它。

所以听起来你在问以下问题。你有

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

class Child : Parent { }
您希望隐藏某些属性,使其在子对象实例中不可见

不要这样做!不要对基类隐藏可见的属性。首先,四处走动很容易:

Parent p = new Child();
p.ParentProperty; // oops!
第二,这是对法律的严重违反。基本上,这个原则是说,你知道的关于父对象的所有实例都是正确的,对于子对象的所有实例也应该是正确的。在这里,我们知道父对象的所有实例都有一个类型为SomeType的名为ParentProperty的可见属性。因此,所有儿童的例子都应该如此


你能告诉我们你为什么要这样做,也许我们可以建议一个替代方案吗?

所以听起来你在问以下问题。你有

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

class Child : Parent { }
您希望隐藏某些属性,使其在子对象实例中不可见

不要这样做!不要对基类隐藏可见的属性。首先,四处走动很容易:

Parent p = new Child();
p.ParentProperty; // oops!
第二,这是对法律的严重违反。基本上,这个原则是说,你知道的关于父对象的所有实例都是正确的,对于子对象的所有实例也应该是正确的。在这里,我们知道父对象的所有实例都有一个类型为SomeType的名为ParentProperty的可见属性。因此,所有儿童的例子都应该如此


你能告诉我们你为什么要这样做,也许我们可以建议一个替代方案吗?

如果你在说child class时派生class,幸运的是没有办法让它发挥作用。看看下面的代码,这将是一个糟糕的故事:

base myObj=objectFactory.Create; myObj.theMethodHiddenAway

工厂可以返回任何base类型的对象,包括从base派生的所有类。编译器需要决定调用编译时重载结果的MethodHiddenAway的版本,因为它没有具体类型的编译时,如果可以通过继承使方法消失,编译器将不知道MethodHiddenAway是否存在


我建议你看看你的设计,因为你问的东西闻起来像是两个设计缺陷之一。方法首先不属于基类,或者派生类不应从基类继承

如果你说派生类是子类,那么幸运的是,没有办法让它正常运行。看看下面的代码,这将是一个糟糕的故事:

base myObj=objectFactory.Create; myObj.theMethodHiddenAway

工厂可以返回任何base类型的对象,包括从base派生的所有类。编译器需要决定调用编译时重载结果的MethodHiddenAway的版本,因为它没有具体类型的编译时,如果可以通过继承使方法消失,编译器将不知道MethodHiddenAway是否存在


我建议你看看你的设计,因为你问的东西闻起来像是两个设计缺陷之一。要么该方法根本不属于那里,要么派生类不应从基类继承。子类引用始终可以隐式转换为父类引用,因此,如果不将属性从父类中删除,则无法阻止该属性的使用。

。子类引用始终可以隐式转换为父类引用,因此,如果不将属性从父类中删除,则无法阻止使用该属性。

不要这样做

如果需要,您会遇到设计问题。指示您的子类应该可以替换父类。这意味着所有使用父类的代码都应该能够使用子类。如果要删除属性,则情况并非如此。无论在何处使用特定属性,都无法将父对象替换为子对象。

不要


如果需要,您会遇到设计问题。指示您的子类应该可以替换父类。这意味着所有使用父类的代码都应该能够使用子类。如果要删除属性,则情况并非如此。无论在哪里使用特定的属性,您都不能用子属性替换父属性。

我想最明显的问题/答案是,也许您应该将该属性设置为私有属性。
当然,除非你一开始就无法访问源代码,否则我想最明显的问题/答案是,也许你应该将该房产私有化。
当然,除非您没有访问源代码的权限,否则请参见本帮助,您可以对属性进行阴影处理并将其设置为只读:

请参见本帮助,您可以对属性进行阴影处理并将其设置为只读:

您问的是三个问题

java语言C++语言C++语言:java java语言:完全不同的语言——你实际使用的是哪一种语言?刚才我看了一下我假设的标签,你是指成员,但是C++和我假设Java没有属性。@ YaoBe:是的,Java也没有。@ Neil Butterworth:因为他已经标记了[C]、[C++]和[java],但是只有其中一个有属性,我假设他问了C。你问了61个问题,并且只接受了25%个问题。你问的是三种完全不同的语言——你实际使用的是哪一种?我只是看了一下我最初假设的成员,而C++和我认为java没有属性。Java也没有。@Neil Butterworth:因为他把它标记为[c]、[c++]和[Java],但其中只有一个有属性,我假设他问的是关于C的问题。你问了61个问题,其中只有25%的问题接受了答案。请注意,建议私人成员使用不同的大小写。但这在家长中是公开的class@santose:您能澄清一下您所说的是嵌套类还是派生类吗?是的,这是当前的答案。如果需要隐藏基类的一个或多个属性,请使用代理设计模式:并仅通过代理类显示所需的属性。请注意,建议对私有成员使用不同的大小写。但它在父类中是公共的class@santose:你能澄清一下你说的是嵌套类还是派生类吗,这是目前的答案。如果需要隐藏基类的一个或多个属性,请使用代理设计模式:并仅通过代理类显示所需的属性。