假设我有一个名为A的类,它有两个版本A1和A2。
class A{};
class A1 : A{};
class A2 : A{};
我还有一个会使用这些的课程。
class B
{
B(A obj)
{
if(obj.type(A1)){}//do this
else(obj.type(A2)){})//do this
}
}
问题:
1)假设有100个或1000个派生自A的类,那么如何通过使用“switch”或“if”>在B的构造函数中实现它。在这两种情况下,如果我必须延长课程,我将违反“开放封闭原则”。
2)if(obj.type(A1))
这个实现是实现检测哪个类对象的最佳方法。
答案 0 :(得分:0)
如果您有100个来自同一基类的类,则需要重新考虑您的设计。
也就是说,有时你会有很多类做类似的事情。
一种选择是使用interface
,让您的不同类实现该接口,并且"执行此操作"分别在每个子类中实现:
class B { B(A obj) {
if(obj.type(A1)){}//do this
else(obj.type(A2)){})//do this
} }
变为
interface AInterface
{
public void doThis();
}
abstract class A implements AInterface
{
...
}
class A1 extends A
{
public void doThis()
{
...
}
}
class A2 extends A
{
public void doThis()
{
...
}
}
class B { B(AInterface obj) {
obj.doThis();
} }
另一种更高级的方法是使用Visitor design pattern。