如何在不违反开放封闭原则的情况下通过多态性处理100多个类

时间:2018-01-09 11:03:09

标签: oop

假设我有一个名为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))这个实现是实现检测哪个类对象的最佳方法。

1 个答案:

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