访问派生类属性成员

时间:2014-11-19 05:58:11

标签: c# inheritance properties casting

我有一组业务逻辑类,它们从一系列抽象类继承而来。我还有一组业务数据类,它们继承自己自己的抽象类链。在这两种情况下,我的派生类(C)都继承自抽象类(B),它本身继承自抽象类(A)。 (因此,C:B和B:A)。

孤立地,我的逻辑类链表现得如预期的那样。方法调用使用正确的基础或重写的实现。我的数据类也是如此(新的字段/属性出现在正确的级别)。

我的问题是尝试将数据类添加为逻辑类的属性。基本抽象逻辑类(A)必须能够调用基本抽象数据类中的某些字段(同样,A)。但是,链(B)中的下一个抽象逻辑类将需要在链的下一级(B)中使用一些字段/属性。派生的混凝土类型(C)也是如此。

现在,我最初认为如果在我的" A"逻辑类我为基本抽象数据类添加了一个属性,我可以在链上进一步使用这个属性(例如在" B"逻辑类中我可以使用this.Data.Variable访问&#34 ;变量"字段,其中"变量"字段在" B"数据类中实现。我发现没有强制转换,我只能在整个逻辑类链中使用基本抽象数据类中公开的字段。

我在这个网站上找到了一些很好的建议,并走上了使用泛型的道路。当我在数据类上使用字段时,我仍然需要在基本逻辑类中执行强制转换(但在派生类中使用字段时不需要强制转换)。

请参阅下面的课程示例。我在基础逻辑类(LogicA)中实现了一个MethodA,以演示我需要转换为正确的数据类型以使用其字段的位置。

abstract class LogicA<T>
{
    public T Data { get; set; }

    public virtual void MethodA()
    {
        var data = (DataA)((dynamic)this.Data);
        data.FieldA = "T";
    }
}


abstract class LogicB<T> : LogicA<T>
{
    public virtual void MethodB()
    {

    }
}

class LogicC : LogicB<DataC>
{
    public void MethodC()
    {
        this.Data.FieldB = "BBB";
    }
}

abstract class DataA
{
    public string FieldA { get; set; }
}

abstract class DataB : DataA
{
    public string FieldB { get; set; }
}

class DataC : DataB
{
    public string FieldC { get; set; }
}

使用逻辑类时,我可以毫无问题地执行以下操作:

        LogicC logic = new LogicC();
        logic.Data = new DataC();
        logic.Data.FieldA = "A";
        logic.Data.FieldB = "B";
        logic.Data.FieldC = "C";
        logic.MethodA();

有没有更好的方法来实现我想要实现的目标?我可以看到这种方法在使用数据字段时通过抽象逻辑类进行转换是乏味的。

1 个答案:

答案 0 :(得分:0)

只需为逻辑类指定限制:

abstract class LogicA<T>
    where T: DataA
{
    public T Data { get; set; }

    public virtual void MethodA()
    {
        var data = (DataA)((dynamic)this.Data);
        data.FieldA = "T";
    }
}

对你的层级中的其他类使用相同的方法。