访问抽象类的成员

时间:2012-07-09 09:48:47

标签: c# oop object-oriented-analysis

我有以下类层次结构:

public abstract class BaseClass : IBaseInterface
{

    public int PropertyA{
        get
        {
            return this.propertyA;
        }

        set
        {
            this.propertyA = value;
            // ... some additional processing ...
        }
    }
}

DerivedClassB : BaseClass
{
    // some other fields
}

public class ContainingClassC
{
    public IBaseInterface BaseInterfaceObjectD
    {
        get;
        set;
    }
}

现在,为了访问DerivedClassB-Object的PropertyA(继承自BaseClass),我必须将对象强制转换为BaseClassA的祖先,如下所示:

// This ContainingClassC is returned from a static, enum-like class:
// containingObject.PropertyA is DerivedClassB by default.
ContainingClassC containingObject = new ContainingClassC();

((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42;

有没有办法可以重组这些类来取消演员阵容?这段代码是图书馆的一部分,我的同事希望我摆脱演员阵容。

目标是简单地写containingObject.BaseInterfaceObjectD.PropertyA = 42

1 个答案:

答案 0 :(得分:0)

首先,在行((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42;中,您将成员转换为声明它的相同类型,因此转换实际上不会执行任何操作。

为了能够访问派生类中的PropertyA - 因为要将其转换为接口 - 必须在接口中声明该属性,然后在BaseClass中实现。

public interface IBaseInterface{
  int PropertyA{get;set;}
}

public abstract class BaseClass : IBaseInterface{
  public int PropertyA{
    get{ return this.propertyA;}
    set {this.propertyA = value;}
   }
}

只要接口正确实现,ProprtyA应该在基类,派生类或其中任何一个都可用于接口类型。

如果只是在IntelliSense中没有显示该属性的问题,则可能是您的设置有问题。查看选项 - >文本编辑器 - > C#并确保您已启用IntelliSense,而不是设置为隐藏任何标记。