我正在尝试实现装饰器模式,这里是我的说明:
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 Menu
,Extra
的构造函数需要Menu
,那么为什么编译器不满意?
编译器消息:Type mismatch: cannot convert from Extra to Sandwich
感谢您的澄清。
答案 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
上面的代码会失败。因此,不允许将非三明治指定为沙子。