我正在尝试创建一组类,其中共同的祖先负责设置各种属性所涉及的所有逻辑,后代只是根据特定后代是否需要更改属性的访问权限。 / p>
当我尝试按下图所示执行此操作时,出现编译错误:“覆盖'受保护'继承成员时无法更改访问修饰符”
有没有办法实现我想要做的事情?感谢
public class Parent
{
private int _propertyOne;
private int _propertyTwo;
protected virtual int PropertyOne
{
get { return _propertyOne; }
set { _propertyOne = value; }
}
protected virtual int PropertyTwo
{
get { return _propertyTwo; }
set { _propertyTwo = value; }
}
}
public class ChildOne : Parent
{
public override int PropertyOne // Compiler Error CS0507
{
get { return base.PropertyOne; }
set { base.PropertyOne = value; }
}
// PropertyTwo is not available to users of ChildOne
}
public class ChildTwo : Parent
{
// PropertyOne is not available to users of ChildTwo
public override int PropertyTwo // Compiler Error CS0507
{
get { return base.PropertyTwo; }
set { base.PropertyTwo = value; }
}
}
答案 0 :(得分:11)
您可以使用“new”而不是“override”来隐藏父级的受保护属性,如下所示:
public class ChildOne : Parent
{
public new int PropertyOne // No Compiler Error
{
get { return base.PropertyOne; }
set { base.PropertyOne = value; }
}
// PropertyTwo is not available to users of ChildOne
}
public class ChildTwo : Parent
{
// PropertyOne is not available to users of ChildTwo
public new int PropertyTwo
{
get { return base.PropertyTwo; }
set { base.PropertyTwo = value; }
}
}
答案 1 :(得分:5)
您无法更改访问权限,但可以重新声明具有更多访问权限的成员:
public new int PropertyOne
{
get { return base.PropertyOne; }
set { base.PropertyOne = value; }
}
问题是这是不同的 PropertyOne
,并且继承/虚拟可能无法按预期工作。在上面的情况下(我们只调用base.*
,而新方法不是虚拟的)可能没问题。如果你需要真正的多态性上面这个,那么你不能在不引入中间类的情况下(AFAIK)(因为你不能new
和override
成为同一个成员在同一类型):
public abstract class ChildOneAnnoying : Parent {
protected virtual int PropertyOneImpl {
get { return base.PropertyOne; }
set { base.PropertyOne = value; }
}
protected override int PropertyOne {
get { return PropertyOneImpl; }
set { PropertyOneImpl = value; }
}
}
public class ChildOne : ChildOneAnnoying {
public new int PropertyOne {
get { return PropertyOneImpl; }
set { PropertyOneImpl = value; }
}
}
以上重要的一点是,仍然只有一个虚拟成员可以覆盖:PropertyOneImpl
。
答案 2 :(得分:2)
NO。您仍然可以使用Your的
隐藏继承的属性public class ChildTwo: Praent {
public new int PropertyTwo {
// do whatever you want
}
}
ps:这不再是虚拟/覆盖关系(即没有多态调用)