colorprinter
はそうpublic void drucke()
のその実装は、あなたの(p)colorprinter
キャストで表現されている何
を変更しない、あなたはそれにキャスト演算子を使用するときcp
のインスタンスであることを停止しないの一種でありますオブジェクト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");
}
}
もちろん、制約は常にそのような再設計を可能にするわけではありません。あなたはプリンタが必要ですか(複数の印刷機能を持つことができることを表現したい場合は、今すぐ
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");
}
}
:基本クラスを拡張するのではなく、コンストラクタ(dependency injection)にパラメータとして基本要件を渡すのも良い代替することができますあなたが好きな色とB/W)の両方のように、あなただけの、たとえば、できるだけ多くの余分な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
、public void drucke()
のDruckable
のその他の実装は今後提供されます。単体テストを導入したい場合にはさらに実用的です。例えば、druke()
を投げてPaperJamException
を投げるなど、テストしたい特定の条件を強制するモックアップオブジェクトを提供することができます。インタフェースは、仕事をオーバーライドし、相続、デファクトスタンダードでも公式java code conventions guideの最新のリビジョンた内容に応じて、そして、ところで
https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.htmlを参照してください方法の詳細については
、JavaでのクラスはCamelCase命名規則を使用する必要があります。 BlackAndWhitePrinter blackAndWhitePrinter
とColorPrinter colorPrinter
のようなすべての定義でセマンティックネーミングを使用することで、大きなメリットを得ることができます。
わかりやすくするために、クラス名を大文字で表記してください。 –
クラス、mehtodsなどに名前を付けるときは、英語以外の母国語を使用しないでください。English camelCaseを使用してください。 –
クラスタイプは、「外部ユーザー」(他のクラス)によってオブジェクトがどのように見えるかを定義したものです。メソッド実装はインスタンスにバインドされており、型は外部コトグラフを定義するだけです。 – topr