Разрешить поле в дочернем классе иметь тип, происходящий от типа поля в родительском классе - PullRequest
2 голосов
/ 18 декабря 2009

У меня есть следующие настройки (очевидно, упрощенно):

Абстрактный класс с объектом 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 с разными аргументами для каждого. ) * * 1009

Мне не нравится использовать «как» каждый раз, когда я хочу получить доступ к полю. Я хотел бы, чтобы Y и Z знали, что поле принадлежит к их обязательному классу, но ограничьте этот класс наследником класса в X.

Есть ли способ сделать это или нет, или я пытаюсь сделать что-то ужасное?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2009

Вы можете попробовать дженерики, хотя это не красиво:

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);
    }
}
2 голосов
/ 18 декабря 2009

Вы можете использовать дженерики.

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);
    }
}
...