Decorator Pattern,编译器不允许类型传播

时间:2017-08-24 15:26:26

标签: java decorator

我正在尝试实现装饰器模式,这里是我的说明:

public abstract class Menu{ //propagate the type
} 

并且

public class Sandwich extends Menu{ // Concrete class which is a Menu

} 

并且

public abstract class Extra extends Menu{

    Menu menu;

    public Extra(Menu menu){ // the constructor takes a Menu type
       this.menu=menu;
    }
}

问题是编译器不允许这样做的原因:

public class Test {
  Menu sand1 = new Sandwich();
  sand1 = new Extra(sand1); //It's fine for the compiler

  Sandwich sand = new Sandwich();
  sand = new Extra (sand);// Compiler cries here !!
}

通过继承三明治IS-A MenuExtra的构造函数需要Menu,那么为什么编译器不满意?

编译器消息:Type mismatch: cannot convert from Extra to Sandwich

感谢您的澄清。

2 个答案:

答案 0 :(得分:1)

问题是没有将df1 = df.rename(columns={'A':'A1', 'B':'B1', 'A1':'A2', 'B1':'B2'}).reset_index() pd.wide_to_long(df1, stubnames=['A', 'B'], i='index', j='id')\ .reset_index()[['A', 'B', 'id']] A B id 0 1 2 1 1 5 6 1 2 9 10 1 3 3 4 2 4 7 8 2 5 11 12 2 传递给sand构造函数,问题是尝试将Extra分配到new Extra(sand)类型。

答案 1 :(得分:0)

想象一下这种情况(三明治有一些方法):

 public class Sandwich extends Menu{
  public void addSalad(){
  //...
  }
 } 

所以现在你这样做了:

 Sandwich sand = new Sandwich();
 sand.addSalad();//works

 sand = new Extra (sand);//imagine this doesnt throw errs
 sand.addSalad();//will fail as sands not a sandwich anymore

上面的代码会失败。因此,不允许将非三明治指定为沙子。