ここには素晴らしい答えがたくさんありますが、インターフェイスと抽象クラスの両方を使用するのが最善の方法であることがよくあります。 この不自然な例を考えてみましょう。
あなたは投資銀行のソフトウェア開発者であり、市場に注文を出すシステムを構築する必要があります。あなたのインターフェースは、トレーディングシステムが何をするかについての最も一般的な考えを捉えています。
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()
がインターフェースの一部ではないのか不思議に思うかもしれません。インターフェースは、取引システムの最も一般的なコンポーネントを定義することを忘れないでください。別のエンジニアは、完全に異なる取引システムを開発する場合があります。このシステムでは、良い取引を見つけることを気にしません。このインターフェースは、セールスデスクがシステムにもインターフェースできることを保証するため、「お得な」などのアプリケーションの概念にインターフェースを絡ませないことが望ましいです。