是否有一种设计模式可以将以下代码重构为编译时类型安全的东西(即没有类型转换)?
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 { }
答案 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
}
}