Soyut sınıfların amacı nedir?

6 Cevap php

PHP OOP öğrenmeye çalışıyorum, ve ben arayüzleri ve soyut sınıflar hakkında bazı karışıklık var. Her ikisi de hiçbir uygulamaları, sadece tanımlarını içeren ve bunların alt sınıfları ile uygulanmalıdır. Soyut sınıfların neresini açıkça arabirimleri onları ayıran? Ayrıca nedeniyle hangi nedenlerle dayalı belirgin benzerlikler, ben diğer üzerinden kullanmak için karar vermelidir?

6 Cevap

Bu tür yöntemler veya özellikleri gibi somut üyeleri içeren soyut sınıfları oluşturmak mümkündür. Sen yine doğrudan soyut sınıf örneğini değil, ancak herhangi bir örneğinin alt sınıflar soyut sınıfında tanımlanan uygulanan üyeleri yararlanabilir.

Bir arayüz, karşılaştırma, herhangi bir uygulama mantığı içerir asla. Bu arayüzde tanımlanan tüm üyelerin uygulanmasını sağlamak için aşağı her uygulama sınıfına etmektir.

Ben farklılıkları, soyut bu tür is-a sınıf bir alt sınıfını görüntülemek nasıl açısından. örneğin Dog bir Animal olduğunu. Ben bir does-a ilişkisi gibi bir arayüz göreceksiniz. örneğin ICanDisplayImages uygulayan sınıf görüntüleri olduğunu söyler, ama sınıf gerçekte neyi temsil konusunda bana bir şey söyler.

Her ikisi de hiçbir uygulamaları içermez ..

Soyut sınıf yöntemlerin tümü ya da sadece bir kısmını uygular olabilir. Ama ana felsefesi - (bir temel işlevselliğini genişletmek) çocuk sınıflar yeni yöntemler eklemek için varolan soyut sınıfını genişletmek edilir.

Bir çocuk sınıfta sadece tek bir sınıf (soyut sınıf) uzatabilirsiniz. Soyut sınıf uygulamak gerekir işlevi tanımlamak ya da sadece çocuk sınıflar diğer yöntemlerle uzanır.

Arayüzleri sınıf davranışları tanımlamak için kullanırlar. Eğer birden fazla arabirim uygulamak (ve benim çocuk-sınıf, bu ve bu Rainstorm! Bunu yapmalısınız demek), ama yalnızca tek bir soyut sınıfını genişletmek yapabilirsiniz.

Sırasında bir interface creates a follows-a ilişki kendisi ve alt sınıf arasında bir abstract class forms an is-a ilişki. Gibi, soyut sınıflar çok daha somut arayüzleri daha vardır ve onlar da somut uygulamaları içermez (örneğin Template methods) bir arabirim bir uygulama sınıfı izlemesi gereken yöntemler bir sözleşme dizi tanımlar iken. Olabilir Bu uygulama sınıf mutlaka soyut sınıf olmamalıdır gibi soyutlama çok daha yüksek bir seviyesidir. Lütfen API standardize için kullanın.

İlgili sorular: http://stackoverflow.com/search?q=abstract+vs+interface

Diğer yanıtlar anlatılan OOP felsefe ötesinde, ben soyut sınıfın önemli kullanım bir iskelet tür olduğunu düşünüyorum.

Bu bir uygulama tasarımı, ya da bir ekip ile çalışmak zaman çalışmak için bir taban kod var çünkü, yararlı ve o arayüz yakın ancak daha gelişmiş bir iş akışı ile bulunuyor uzanır.

Yöntem soyut olarak tanımlanan değilse soyut bir sınıf yöntemi uygulamaları içerebilir. Yöntem Anahtar olarak tanımlanır, bu bir uygulama içermez, ama onun inheritors tarafından uygulanacak gerekmektedir. Mirasçı onun davranışları kullanmak için izin için bir soyut sınıf, örneği, ancak miras olamaz.

Bir arabirim yalnızca yöntem imzaları tanımlar ve ondan devralan herhangi bir sınıf arayüzü bulunan tüm yöntemleri uygulamak gerekir.

Genellikle arayüzleri sözleşmeleri tanımlamak için kullanılır, bu yüzden tür denetlemesini olsun edilir. Iyi bir fikir "arayüzler karşı programlama" adlı bir programlama tarzı da vardır. Bkz Dependency Inversion Principle:

A. Yüksek seviyeli modüller düşük seviye modüllere bağlıdır olmamalıdır. Hem soyutlamalar bağlı olmalıdır.

B. Abstractions ayrıntılar bağlı olmamalıdır. Detaylar soyutlamalar bağlı olmalıdır. "

Yerine type hinting sınıflara karşı bir, işlevleri ve yöntemleri tanımlamak Yani, sadece arayüzleri karşı ipucu.

İşte bir örnek. Şöyle diyelim, sen giriş akışları için arabirimleri tanımlamak ve çıkış akışları:

interface OutputStream{
  write($string); // Writes a string to the output.
  close(); // Closes the output stream.
}

interface InputStream{
  read($length); // Reads at most $length characters.
  eof(); // TRUE, if the input stream is empty.
}

Şimdi yaratabilecek copy işlev veya yöntem, hangi kopya bunlardan herhangi birine sahip olmayan bir girişe bir derenin tam çıkışı:

// 50 is just chosen randomly.
function copy(InputStream $input, OutputStream $output){
  while(!$input->eof()){
    $output->write($input->read(50));}}

Tebrikler, copy uygulama şimdi bir tane bile uygulama olmadan bir giriş ve çıkış akımının every kombinasyonu için çalışıyor.

Özet sınıfları, diğer taraftan, tam fonksiyonel sınıfı uygulamak zorunda kalmadan ortak özelliğe uygulamak için kullanılabilir.

Yine bir örnek. Eğer çıkış akışları istiyorum, diyelim. Sen çıkışına bir dize yazar ve çıkış dizesi ve ek bir yeni satır yazar bir yöntem writeLine($s), istediğiniz bir yöntem write($s), istiyorum. O zaman bu uygun olacaktır:

abstract class AbstractOutputStream{
  public function writeLine($s){
    $this->write($s."\n");}}

Beton çıktı akımları artık, soyut çıktı akımına devralan uygulamak sadece write ve writeLine ücretsiz alabilir!