【问题标题】:Allow field in a child class to be of a type descended from the type of the field in the parent class允许子类中的字段是父类中字段类型的后代类型
【发布时间】:2009-12-18 12:03:47
【问题描述】:

我有以下设置(显然是简化的):

一个抽象类,带有一个 A 对象和一个抽象方法

abstract public class X
{
    protected A myA;
    abstract public int MethodForX();
}

两个继承类,每个类都覆盖方法。然而,他们不使用 A 对象,而是使用 B 和 C 对象,每个对象都继承自 A。

public class Y : X
{
    public Y()
    {
        myA = new myB(); //B inherits from A
    }
    override public int MethodForX()
    {
        return (myA as myB).MethodForB(1);
    }
}

public class Z : X
{
    public Z()
    {
        myA = new myC(); //C inherits from A
    }
    override public int MethodForX()
    {
        return (myA as myC).MethodForC(1, 2);
    }
}

我无法直接控制 A、B 和 C。(具体来说,B 和 C 是两个不同的表适配器,A 是它们的共同祖先,MethodForB/C 是 GetData 方法,每个都有不同的参数。 )

我不喜欢每次想要访问该字段时都使用“as”。我想让 Y 和 Z 知道该字段属于他们所需的类,但将该类限制为 X 中类的继承者。

有没有办法做到这一点,或者我是否试图做一些可怕的事情?

【问题讨论】:

  • 我不太确定你的评论是否意味着“它正在工作”,但是是的 - 你可以拥有class X {}class X<T> : X {}class Y : X<A>class Z : X<B>,然后与Z 通过非通用 X API。
  • 糟糕。是的,我的意思是它正在工作,干杯。

标签: c# inheritance abstract-class


【解决方案1】:

你可以试试泛型,虽然它不漂亮:

abstract public class X<T> where T : A
{
    protected T myA;
    abstract public int MethodForX();
}

public class Y : X<B>
{
    public Y()
    {
        myA = new B(); //B inherits from A
    }
    override public int MethodForX()
    {
        return myA.MethodForB(1);
    }
}

public class Z : X<C>
{
    public Z()
    {
        myA = new C(); //C inherits from A
    }
    override public int MethodForX()
    {
        return myA.MethodForC(1, 2);
    }
}

【讨论】:

  • 嗯...我不知道你可以指定这样的祖先,我喜欢它。我试试看。
  • 好的,我需要进一步的改变:一个只包含抽象方法的抽象类 X,X 继承自该抽象方法,这样我仍然可以使用“is X”/“作为X" 而不是 "is X<...>",我不知道 ... 应该是什么。它现在变得有点复杂了,但仍然在做我想做的事情。
【解决方案2】:

你可以使用泛型。

abstract public class X<T> where T : A
{
    protected T myA;
    abstract public int MethodForX();
}

public class Y : X<B>
{
    public Y()
    {
        myA = new B(); //B inherits from A
    }
    override public int MethodForX()
    {
        return myA.MethodForB(1);
    }
}

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多