ここには素晴らしい答えがたくさんありますが、インターフェースと抽象クラスの両方を使用することが最善の方法であることがよくあります。 この不自然な例を考えてみましょう:
あなたは投資銀行のソフトウェア開発者で、市場に注文を出すシステムを構築する必要があります。あなたのインターフェースは、取引システムが何をするかについての最も一般的な考え方を捉えています。
1) Trading system places orders
2) Trading system receives acknowledgements
インターフェイスでキャプチャできますITradeSystem
public interface ITradeSystem{
public void placeOrder(IOrder order);
public void ackOrder(IOrder order);
}
これで、セールス デスクや他のビジネス ラインで働くエンジニアが、システムとのインターフェイスを開始して、既存のアプリに発注機能を追加できるようになりました。そして、まだ構築を開始していません。これがインターフェースの力です。
そこで、株式トレーダー向けのシステムを構築します。彼らはあなたのシステムに安い株を見つける機能があると聞いて、それを試してみたいと思っています! と呼ばれるメソッドでこの動作をキャプチャしますfindGoodDeals()
が、市場への接続には多くの厄介なものがあることにも気付きます。たとえば、 を開く必要がありますSocketChannel
。
public class StockTradeSystem implements ITradeSystem{
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
具体的な実装には、 のような厄介なメソッドがたくさんありますが、トレーダーが実際に気にかけているのはconnectToMarket()
それだけです。findGoodDeals()
ここで、抽象クラスの出番です。 あなたの上司は、通貨トレーダーもあなたのシステムを使用したいと言っています。そして通貨市場を見ると、配管は株式市場とほぼ同じであることがわかります。実際、connectToMarket()
外国為替市場に接続するために逐語的に再利用できます。ただし、findGoodDeals()
通貨の分野ではまったく異なる概念です。したがって、コードベースを海の向こうの外国為替の達人に渡す前に、まずabstract
クラスにリファクタリングし、未実装のままにfindGoodDeals()
します。
public abstract class ABCTradeSystem implements ITradeSystem{
public abstract void findGoodDeals();
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
株式取引システムfindGoodDeals()
は、既に定義したとおりに実装されます。
public class StockTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
しかし今では、FX の達人はfindGoodDeals()
、通貨の実装を提供するだけでシステムを構築できます。ソケット接続やインターフェイス メソッドを再実装する必要はありません。
public class CurrencyTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
ccys = <Genius stuff to find undervalued currencies>
System.out.println("The best FX spot rates are: " + ccys);
}
インターフェースへのプログラミングは強力ですが、同様のアプリケーションは、ほぼ同じ方法でメソッドを再実装することがよくあります。抽象クラスを使用すると、インターフェイスの機能を維持しながら再実装を回避できます。
注:findGreatDeals()
なぜがインターフェースに含まれていないのか不思議に思うかもしれません。インターフェイスはトレーディング システムの最も一般的なコンポーネントを定義することを思い出してください。別のエンジニアは、良い取引を見つけることを気にしない完全に異なる取引システムを開発するかもしれません。インターフェースは、販売デスクがシステムにもインターフェースできることを保証するため、インターフェースを「お買い得」などのアプリケーションの概念と絡ませないことが望ましいです。