是否有设计模式用于将派生对象传递给基类方法而不进行强制转换?

时间:2011-04-05 11:24:47

标签: design-patterns

是否有一种设计模式可以将以下代码重构为编译时类型安全的东西(即没有类型转换)?

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 个答案:

答案 0 :(得分:2)

您可能希望在b.DoStuff(中考虑double dispatch,即呼叫Specific1#DoStuff())。 Base1不应该对如何处理其他类过于聪明。

答案 1 :(得分:1)

如果要访问在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方法。

答案 2 :(得分:1)

在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
    }
}