【发布时间】:2010-11-23 06:08:27
【问题描述】:
我想知道是否可以从派生类中隐藏基类属性:
例子:
class BaseDocument
{
public string DocPath{get; set;}
public string DocContent{get; set;}
}
class DerviedDocument: BaseDocument
{
//this class should not get the DocContent property
public Test()
{
DerivedDocument d = new DerivedDocument();
d.//intellisense should only show me DocPath
//I do not want this class to see the DocContent property
}
}
我无法将 DocContent 属性设为私有,因为我想在其他地方实例化 BaseDocument 类并在那里使用该属性。无论如何,这将扼杀财产的想法。
解决此问题的一种方法是使用接口,例如 IDoc,它公开 DocPath 属性并使 BaseDocument 和 DerivedDocument 都实现该接口。但这会破坏他们的父子关系。
我可以使用 new 和 override 关键字,但这也不是正确的方法,因为孩子仍然“看到”该属性
我尝试在 DocContent 上使用“密封”关键字,但这似乎也不能解决问题。
我知道它“破坏”了继承,但我想这种情况应该经常出现,孩子需要从父母那里获取所有其他东西,但只有一两个属性。
如何优雅地处理这样的场景?
【问题讨论】:
-
我有一个类似于问题的现有场景。另外,我只是想知道!
-
就像其他人提到的......如果是这种情况,你不应该从基础派生。派生类应该完全支持基类接口。如果我的程序使用 CBase,它的行为应该不会改变,即使我为 CBase 提供任何 CDerived - objectmentor.com/resources/articles/lsp.pdf
-
-1 表示无效问题。首先,多年来,C# 和所有面向对象的编程语言都建立在标准模式集之上。 “Public”的意思是真正的公众,应该随处可见。你不能有一个公共的地方,它可以在某个地方变成私有的,尝试通过界面、其他模式或内部关键字来解决答案,但试着理解系统的设计是通用的,对于每个人来说,它不能为你的小时间需求而改变。
-
@Akash:如果你再次阅读这个问题,我已经提到我理解使用这种方法不是一个好的设计,我提供了我自己的解决方案。但是,如果您已经从遗留代码中获得了类似的东西,而您无法更改并且被该基类所困怎么办?那你怎么处理。那是我的问题。所以我认为就情况的实用性而言,这仍然是一个有效的问题。
标签: c# .net inheritance properties