我无法访问类的定义,但我可以继承它。我希望在派生类中拒绝访问基类中公共的某些字段,这是出于意外访问/设置/获取字段/属性的明显原因。
我有什么选择?
编辑:
为什么选择downvote?我必须重构一个使用上述继承字段的大型代码,我必须手动处理不仅涉及那些行,而且还涉及分层树中的链接继承字段的行。
此外,我必须确保即使我或我的合作伙伴也无法访问这些字段/属性,仍然使用那些有意继承的字段。
编辑:
必须区分两种不同的情况:当程序员从头开始设计应用程序时以及当他/她被迫从无法访问的代码开始时。
在前一种情况下,他/她负责将OOP和设计模式应用于最适合未来预期用途的设计模式。
在后者中,当程序员需要从略微修改的专有给定类开发以避免长期不必要的并发症时,通常会出现这种情况。通常,原始代码设计者不能用尽用例。因此,开发人员使用" promise"来制作该类的自定义版本。原始类不会被使用,即使曾经使用过,它也只会用于最初的目的,并且新版本不存在继承或其他关系。与原始类相比,此新版本将具有其他成员和其他缺少的成员。这与我在SOLID中的情况一致,尽管适用于班级
在这些情况下,我承认继承不是要走的路,因为它有不同的目的,开发人员会使用继承从SOLID中破坏L(和概念上的I)。但是没有任何语言可以提供这一功能,所以没有选择权。
答案 0 :(得分:1)
我看到它的方式,你需要使用Decorator / Wrapper设计模式。不是继承它,而是围绕它包装一个类。
你有的课程:
public class SealedPerson
{
public string Prop1 {get;set;}
public string Prop2 {get;set;}
}
你需要的课程:
public class SealedPersonWrapper
{
public SealedPersonWrapper(SealedPerson person)
{
this.Prop1 = person.Prop1;
}
public string Prop1 {get; private set;}
}
答案 1 :(得分:0)
您可以通过分隔接口来完成此操作:
public class BaseClass:IBase
{
private int A;
private int B;
void IBase.SetA()
{
A=10;
}
public void SetB()
{
B=10;
}
}
public class DerivedClass:BaseClass
{
public Set()
{
base.SetB();
//method SetA will not accessible through base class, but will accessible with IBase interface
}
}
答案 2 :(得分:0)
隐藏您想要无法使用的继承字段/属性/方法,并使用它们会产生错误,如下所示:
public class Base // not owned code
{
public int free {get; set;};
public int limited {get; set;};
}
public class Derived:Base // owned code
{
// public new int limited; // NOT hidden! Still accessing Base.limited!
// working:
[Obsolete("Inaccessible hidden inherited variable", true)]
public new int limited {get; set;}
}
true
是禁止编译(触发错误)而不是编译警告所必需的
由于使用了90%的基类,因此编写代码(尤其是对于不需要的字段而不是所需的字段)要容易得多。