如何增加属性的访问修饰符

时间:2009-05-20 09:11:14

标签: c# oop polymorphism

我正在尝试创建一组类,其中共同的祖先负责设置各种属性所涉及的所有逻辑,后代只是根据特定后代是否需要更改属性的访问权限。 / 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; }
    }
}

3 个答案:

答案 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)(因为你不能newoverride成为同一个成员在同一类型):

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:这不再是虚拟/覆盖关系(即没有多态调用)