colorprinter 在您对其使用强制转换运算符时不会停止成为cp 的实例,因此它对public void drucke() 的实现不会改变
你用(p)colorprinter 转换表达的是你期望对象colorprinter 满足的那种契约(接口),它包括一个带有签名public void drucke() 的公共方法,但没有任何具体的实现。
顺便说一下,当你声明p 类型的drucker 时,这个转换已经隐式执行了,所以(p) 在p drucker = (p)colorprinter; 中是多余的。 p drucker = colorprinter; 就足够了。
Here you can learn more about typecasting。
请记住,最好从抽象类或接口扩展,并且只扩展 @Override(实现)抽象方法。更好的代码设计是:
abstract class BasePrinter {
public void druckauftrag() {
// ...
drucke();
}
public void drucke();
}
class p extends BasePrinter {
public void drucke() {
System.out.println("B/W-Printer");
}
}
class cp extends BasePrinter {
public void drucke() {
System.out.println("Color-Printer");
}
}
但当然,限制并不总是允许进行这种重新设计。将基本要求作为参数传递给构造函数 (dependency injection) 而不是扩展基类也是一个不错的选择:
interface Druckable {
void drucke();
}
class Druckauftrager {
Druckable dk;
Druckauftrager(Drukable dk){
this.dk = dk;
}
public void druckauftrag() {
// ...
dk.drucke();
}
}
class p implements Druckable {
public void drucke() {
System.out.println("B/W-Printer");
}
}
class cp implements Druckable {
public void drucke() {
System.out.println("Color-Printer");
}
}
现在,如果您想表达打印机需要或可以具有多种打印功能(如彩色和黑白),您只需编写具有尽可能多的额外 Drukable 属性和构造函数参数的类,例如:
class BlackAndWhiteOrColorPrinter {
p blackAndWhitePrintService;
cp colorPrintService;
Druckable selectedPrintService;
BlackAndWhiteOrColorPrinter (p blackAndWhitePrintService, cp colorPrintService){
this.blackAndWhitePrintService = blackAndWhitePrintService;
this.colorPrintService = colorPrintService;
this.selectedPrintService = blackAndWhitePrintService;
}
public void druckauftrag() {
// ...
selectedPrintService.drucke();
}
}
这样,您甚至可以编写带有MultiPrinter(List<Druckable> printServices) 构造函数的class MultiPrinter,并将任意数量的打印模式添加到其打印服务列表中:p、cp,以及Druckable 的任何其他实现其public void drucke() 将在未来出现。如果您想引入单元测试,这也更加实用,因此您可以提供模型对象来强制您想要测试的特定条件,例如 druke() 抛出 PaperJamException。
有关接口、覆盖和继承如何工作的更多信息,请参阅https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
顺便说一句,根据官方java code conventions guide 的最新版本以及事实上的标准,Java 中的类应该使用CamelCase 命名约定。您还可以从对所有定义使用语义命名中受益匪浅,例如 BlackAndWhitePrinter blackAndWhitePrinter 和 ColorPrinter colorPrinter。