2015-01-19 21 views
7

Düşünüyorum kavramı Traversable arabiriminden gelir. Bu arayüz doğrudan uygulanamaz, bunun yerine onu genişleten bir arayüz uygulanarak yerine getirilir.PHP'nin soyut arayüzler için açık bir uygulaması var mı?

Uygulanamayan ve bunun yerine ortak arabirimlerle genişletilebilen bir arabirim bildirebilir miyim?

Düzenleme: Temel arabirimi genişletebilecek bir arabirim oluşturan bir üçüncü taraf tarafından engellenebileceğinden, olasılığın oldukça anlamsız olacağını anlıyorum. Polimorfizmi ifade etmenin daha temiz bir yolunu arıyorum. Örneğin

:

abstract interface Vehicle 
{ 
} 

interface Car extends Vehicle 
{ 
    public function drive(RouteProvider $routeProvider, $speed) 
} 

interface Boat extends Vehicle 
{ 
    public function sail(BodyOfWater $water, $heading); 
} 

class PeopleMover 
{ 
    public function move(Vehicle $vehicle) 
    { 
     if ($vehicle instanceof Boat) { 
      // move people across bodies of water 
     } elseif ($vehicle instanceof Car) { 
      // move people along roads 
     } 
    } 
} 
+1

Hayır öyle değil, sadece normal bir boş 'Araç' arayüzü bildirip aynı şeyi elde edemez miydiniz? Zaten onu genişletmeyen/uygulayan üçüncü taraflara güveniyorsunuz. –

+1

garip bir örnek. neden yöntemler için ortak bir isim vermiyorsunuz? –

+0

@KarolyHorvath örnekte daha basitleştirilmiş olduğundan, yöntemler farklı gerekli argümanları alacaktır. Örneğin. 'drive' yöntemi muhtemelen bir yol bulma hizmeti alır ve 'yelken' yönteminin su kütlesini bilmesi gerekebilir. Örneğimdeki iki nesne, yaptığım şeyi temsil etmek için çok yakın olabilir. "Iterator" ve "IteratorAggregate" ile "Traversable", farklı şeyler yaptıkları yere ulaşmak istediklerimdir, ancak ne çalıştığınızı biliyorsanız aynı sonuca ulaşabilirler. –

cevap

1

bir arayüz amacı, bir uygulama erişim nesne, çok nesneler tanımlanır nasıl kontrol nasıl tanımlamaktır. Nesnenin uygulamaya bildiriminin bir yolu budur, "Bu arabirimi uygularım, bu yöntemlere sahip olduğuma güvenebilirsiniz."

Nesnelerin nasıl tanımlandığını denetlemek isterseniz, soyut yöntemleri soyut yöntemlerle kullanmalısınız.

+0

I ' m nasıl tanımlandığını kontrol etmeye çalışmıyorum, bu yüzden bir arayüz kullanmak istiyorum. Bununla birlikte, benim yöntemimin, farklı amaçlara sahip olan benzer öğeleri kabul ettiğini/aynı hedefe ulaşmak için farklı argüman türlerini gerektirdiğini beyan etmek isterim. Özetle polimorfizm ... bunu alacağım ya da aynı şeyi yapmıyorlar ... ama aynı sonucu elde etmek için çalışabilirim –

+0

Sanırım polimorfizmle biraz yoldan çıkıyorsunuz. Örneğinize dayanarak, Car :: drive() ve Boat :: sail() 'e sahip olmak yerine, Araç ve Tekne ile kendi uygulamalarına sahip Araç :: transport() aracınız olacaktır. Her ikisi de transport() için aynı yöntem imzasına ihtiyaç duyar, bu yüzden bir parametre Route (Rota) yazılır ve RouteByRoad ve RouteByWater'ı içerecek şekilde genişletirsiniz. – user2045006

+0

Bu, "alt türlemeyi" içeren "dahil etme polimorfizmi" için doğru bir ifadedir. Uygulamanın niyeti, parametrik polimorfizm olmadan bir fonksiyon aşırı yükü aracı olarak ele alırken, 'subtipleme'nin mutlaka tek bir boyuta sahip olmadığı' ad-hoc polymorphism 'olurdu. Benim örneğimi kullanarak 'Araç' nakliye için sorumlu değil, PeopleMover 've farklı ulaşım araçları için farklı gereklilikler değişiyor. Buna ek olarak, bir 'Chauffer' uygulamasının, her ikisini de taşıyabildikleri için bir 'Uçağı' uçurabileceğini düşünmesini istemem. –

İlgili konular