Burada pek çok harika cevap var, ancak sık sık BOTH arayüzlerini ve soyut sınıfları kullanmanın en iyi yol olduğunu görüyorum. Bu uydurma örneği düşünün:
Bir yatırım bankasında yazılım geliştiricisiniz ve bir pazara sipariş veren bir sistem oluşturmanız gerekiyor. Sizin arayüzü bir ticaret sistemi şeylerin çoğu genel bir fikir yakalar yapar ,
1) Trading system places orders
2) Trading system receives acknowledgements
ve bir arayüzde yakalanabilir, ITradeSystem
public interface ITradeSystem{
public void placeOrder(IOrder order);
public void ackOrder(IOrder order);
}
Artık satış masasında ve diğer iş kollarında çalışan mühendisler , mevcut uygulamalarına sipariş verme işlevi eklemek için sisteminizle arayüz oluşturmaya başlayabilir . Ve daha inşa etmeye bile başlamadın! Bu, arayüzlerin gücüdür.
Öyleyse devam edin ve hisse senedi tüccarları için bir sistem oluşturun ; Sisteminizin ucuz hisse senedi bulma özelliği olduğunu ve denemeye çok hevesli olduklarını duydular! Bu davranışı adı verilen bir yöntemle yakalıyorsunuz findGoodDeals()
, ancak aynı zamanda piyasalara bağlanmakla ilgili birçok dağınık şey olduğunu da fark ediyorsunuz . Örneğin, bir 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);
}
Somut uygulamalar gibi bu dağınık yöntemlerin birçoğu olacak connectToMarket()
, ama findGoodDeals()
aslında tüm tüccarlar ilgilendi.
Şimdi burada soyut sınıflar devreye giriyor. Patronunuz, döviz tüccarlarının da sisteminizi kullanmak istediklerini size bildirir. Döviz piyasalarına baktığınızda, sıhhi tesisatın borsalarla neredeyse aynı olduğunu görüyorsunuz. Aslında, connectToMarket()
döviz piyasalarına bağlanmak için kelimesi kelimesine yeniden kullanılabilir. Ancak findGoodDeals()
para arenasında çok farklı bir kavramdır. Bu yüzden kod tabanını okyanusun öteki ucundaki döviz kurucusu çocuğa devretmeden önce, önce bir abstract
sınıfa yeniden düzenleme findGoodDeals()
yaparsınız,
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>
}
Hisse senedi alım satım sisteminiz findGoodDeals()
önceden tanımladığınız gibi uygular ,
public class StockTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
ancak şimdi FX ustası çocuk, sadece findGoodDeals()
para birimleri için bir uygulama sağlayarak kendi sistemini kurabilir ; soket bağlantılarını ve hatta arayüz yöntemlerini yeniden uygulaması gerekmez!
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);
}
Bir arabirime programlama güçlüdür, ancak benzer uygulamalar genellikle yöntemleri neredeyse aynı yollarla yeniden uygular. Soyut bir sınıf kullanmak, arayüzün gücünü korurken, yeniden yorumlamaları önler.
Not: Neden findGreatDeals()
arayüzün bir parçası olmadığını merak edebilirsiniz . Arayüzün bir ticaret sisteminin en genel bileşenlerini tanımladığını unutmayın. Başka bir mühendis, iyi anlaşmalar bulmayı umursamadıkları TAMAMEN FARKLI bir ticaret sistemi geliştirebilir. Arayüz, satış masasının sistemlerine de arayüz vermesini garanti eder, bu nedenle arayüzünüzü "harika fırsatlar" gibi uygulama konseptleriyle karıştırmamak tercih edilir.