Существует ли шаблон проектирования для передачи производного объекта в метод базового класса без приведения? - PullRequest
0 голосов
/ 05 апреля 2011

Существует ли шаблон проектирования, который может преобразовать следующий код во что-то, что является безопасным по типу во время компиляции (то есть без приведения типов)?

public abstract class Base1 {
    public abstract void DoStuff(Base2 b);
}

public class Specific1 : Base1 {
    public override void DoStuff(Base2 b) {
        var s = (Specific2)b;
        // do clever things with s
    }
}

public abstract class Base2 { }
public class Specific2 : Base2 { }

Ответы [ 3 ]

2 голосов
/ 05 апреля 2011

Похоже, вы могли бы рассмотреть двойную отправку здесь, то есть вызов b.DoStuff() в Specific1#DoStuff(). Base1 не должно стать слишком умным в отношении того, что делать с другими классами.

1 голос
/ 05 апреля 2011

В Java вы можете сделать:

public abstract class Base1<T extends Base1> {
public abstract void DoStuff(T b);
}

public class Specific1 extends Base1<Specific2> {
    public override void DoStuff(T b) {
        var T = b;
        // do clever things with s
    }
}
1 голос
/ 05 апреля 2011

Если вы хотите получить доступ к определенным методам, которые представлены в Specific2 (и, следовательно, не определены в его базовом классе, Base2), у вас нет другого выбора, кроме как привести его.

Если вы не используете дженерики (в C # f.e.):

public abstract class Base1<T> where T : Base2
{
    public abstract void DoStuff( T b );
}

public class Specific1 : Base1<Specific2>
{
    public override void DoStuff( Specific2 b ) {}
}

Но это накладывает ограничение на ваш класс Specific1, то есть вы можете передавать только Specific2 экземпляров в метод DoStuff.

...