colorprinter
在使用强制类型转换时仍然是cp
的一个实例,因此它对public void drucke()
方法的实现不会改变。
您使用
(p)colorprinter
强制类型转换所表达的是您期望对象
colorprinter
满足的合同(接口),其中包括具有
public void drucke()
签名的公共方法,但没有任何特定的实现。
顺便说一下,当您声明类型为
p
的
drucker
时,这种强制类型转换已经隐式执行,因此
p drucker = (p)colorprinter;
中的
(p)
是多余的。
p drucker = colorprinter;
就足够了。
在这里您可以了解更多关于类型转换的信息。
请记住,最佳实践是从抽象类或接口扩展,并且只有实现抽象方法
@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");
}
}
当然,限制条件并不总是允许进行这种重新设计。将基本要求作为参数传递给构造函数(依赖注入)而不是扩展基类也可以是一个很好的选择:
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代码规范指南和事实标准,Java中的类应使用驼峰命名法。在所有定义中使用语义化命名也会大大受益,例如BlackAndWhitePrinter blackAndWhitePrinter
和ColorPrinter colorPrinter
。