Ben soyut bir sınıf kullanmanız gereken zaman bir arabirim kullanmak ve ne zaman açıklar mısınız?
Nasıl bir arayüze benim soyut sınıf değiştirebilirim?
Onlar bina olacak sınıfları yöntemler bütünüdür dizi uygulamak için (kendiniz dahil) sisteminizde çalışan geliştiriciler zorlamak istediğinizde bir arayüz kullanın.
Eğer yöntemler bütünüdür numaralarını uygulamak için (kendiniz dahil) sisteminizde çalışan geliştiriciler zorlamak istediğiniz zaman bir soyut sınıfını kullanın and bunları kendi çocuk sınıfları geliştirmeye yardımcı olacak bazı temel yöntemleri sağlamak istiyoruz.
Akılda tutulması gereken bir diğer şey de çoklu arayüzleri uygulayabilir oysa müşteri sınıfları tek, tek bir soyut sınıfını genişletebilirsiniz olduğunu. Soyut sınıflar içinde davranış sözleşmeleri tanımlayan eğer Yani, her çocuğun sınıf yalnızca bir tek sözleşmeye uygun anlamına gelir. Bazen bu iyi bir şey, belirli bir yol boyunca kullanıcı programcılar zorlamak istediğinizde. Diğer zamanlarda da kötü olurdu. PHPs Sayılabilir ve Iterator arayüzleri soyut sınıflar yerine arayüzleri olsaydı düşünün.
(Aşağıda cletus tarafından belirtildiği gibi) gitmek için hangi yolu belirsiz olduğunda yaygın bir yaklaşım, bir arayüz oluşturmak ve sonra da soyut bir sınıf bu arabirim uygulamak sahip olmaktır.
Abstract Class
ve Interface
arasındaki fark
Abstract Classes
Bir soyut sınıf can provide some functionality ve leave the rest for derived class
Türetilmiş sınıf may or may not override temel sınıfta tanımlı somut işlevler
Soyut bir sınıf uzatıldı sınıf çocuk mantıksal ilgili olmalı
Interface
Bir arabirim cannot contain any functionality . It only yöntemlerin tanımları içerir
Türetilmiş sınıf must provide code for all the methods defined in the interface
Tamamen farklı ve non-ilgili sınıfları mantıksal bir arabirimi kullanarak bir araya toplanabilir olabilir
Sadece karışımı içine bu atmak için, ama Cletus soyut bir sınıf ile birlikte bir arayüz kullanarak belirtildiği gibi, sık sık benim tasarım düşüncesini açıklamak arabirimini kullanın.
Örneğin:
abstract class parser implements parserDecoratorPattern {...}
Bu şekilde, benim kod okuyan herkes (ve kim bir Dekoratör Desen ne olduğunu bilir) hemen bilecek) benim çözümleyici oluşturmak ve b) yöntemleri dekoratör deseni uygulamak için kullanılan ne görmek mümkün olacak nasıl.
Ayrıca, ve ben bir Java / C + + / etc programcı olmak, ancak veri tipleri burada devreye girer olamaz burada baz kapalı olabilir. Sizin nesneler bir tür vardır ve tipi hç zaman programlı önemli. Arayüzü içine sıkışabilen öğeleri taşıma yalnızca yöntemleri dönmek türlerini belirler, ancak bunu uygulayan sınıfın taban türü değil.
Geç oldu ve ben tamamen cinsiyetçi değil, ama buraya daha iyi bir psudo-kod örnek düşünemiyorum:
interface TelevisionControls {};
abstract class Remote implements TelevisionControls {};
abstract class Wife implements TelevisionControls {};
Wife wife = new Wife(); // Mail-order perhaps?
Remote remote = new Remote();
isSameType = (bool)(remote == wife)
Aah, cehennem ... Ben muhtemelen Flack bir demet yakalamak üzereyim ...
Neden soyut sınıfları kullanmak için? Aşağıdaki basit bir örnek. Biz aşağıdaki kodu var diyelim:
<?php
class Fruit {
private $color;
public function eat() {
// chew
}
public function setColor($c) {
$this->color = $c;
}
}
class Apple extends Fruit {
public function eat() {
// chew until core
}
}
class Orange extends Fruit {
public function eat() {
// peeling
// chew
}
}
?>
Now I give you an apple and you eat it. What does it taste like? It tastes like an apple.
<?php
$apple = new Apple();
$apple->eat();
?>
Now I give you a fruit.
<?php
$fruit = new Fruit();
$fruit->eat();
?>
Ne gibi tadı geliyor? Evet, çok mantıklı değil, bu yüzden bunu yapmak mümkün olmamalıdır. Bu meyve sınıf özet yapmak hem de bunun iç yemek yöntem ile gerçekleştirilir.
<?php
abstract class Fruit {
private $color;
abstract public function eat(){}
public function setColor($c) {
$this->color = $c;
}
}
?>
Soyut bir sınıf sadece bir arayüz gibi, ancak bir arayüz hepsi soyut iken bir soyut sınıf yöntemleri tanımlayabilirsiniz. Soyut sınıflar boş ve çalışma / somut yöntemleri de var olabilir. Arabirimleri, orada tanımlanmış fonksiyonlar bir vücuda sahip olamaz. Soyut sınıflarda, onlar olabilir.
Gerçek dünyadan bir örnek:
<?php
abstract class person {
public $LastName;
public $FirstName;
public $BirthDate;
abstract protected function write_info();
}
final class employee extends person{
public $EmployeeNumber;
public $DateHired;
public function write_info(){
//sql codes here
echo "Writing ". $this->LastName . "'s info to emloyee dbase table <br>";
}
}
final class student extends person{
public $StudentNumber;
public $CourseName;
public function write_info(){
//sql codes here
echo "Writing ". $this->LastName . "'s info to student dbase table <br>";
}
}
///----------
$personA = new employee;
$personB = new student;
$personA->FirstName="Joe";
$personA->LastName="Sbody";
$personB->FirstName="Ben";
$personB->LastName="Dover";
$personA->write_info();
// Writing Sbody's info to emloyee dbase table
$personB->write_info();
// Writing Dover's info to student dbase table
?>
Perspektif Kodlama Gönderen
Soyut sınıf tüm soyut yöntemler varsa arayüzü soyut bir sınıf değiştirebilirsiniz. Arayüzüne Aksi değişen Özet sınıfı Miras alma sağlar Kod Yeniden kullanılabilirlik dışarı kaybetme olacağı anlamına gelir.
Tasarım Perspektifinden
Onun bir Relationsship "a mı" eğer bir Soyut Sınıf olarak tutun ve alt kümesini / tüm işlevselliği yapmalıdır. Onun bir ilişki "yapmalıyım" eğer Interface olarak tutun.
Eğer, sadece politika uygulama veya kod yeniden kullanılabilirliği ve politika gereken karar. Burada Açıklaması - http://www.buggybread.com/2013/07/java-importance-of-abstract-classes-and.html
Görünümünde bir phylosophic noktadan:
Bir soyut sınıf bir ilişki "bir" temsil eder. Ben meyve var, iyi ben ortak saygılıdır ve ortak davranışı paylaşan Meyve soyut sınıf olurdu diyelim.
Bir arayüz "yapmalıyım" ilişkiyi temsil eder. Bir arayüz, benim görüşüme göre (ki bir genç dev görüşüm), bir eylem tarafından adlandırılmış olmalı, ya da bir eylem yakın bir şey, (Üzgünüz, kelime bulamıyorum, ben bir İngilizce anadili değilim) IEatable Diyelim ki. Bunu yemiş olabilir biliyorum, ama sen ne yemek bilmiyorum.
Görünümünde bir kodlama noktadan:
Lütfen nesneler kodunuzu çoğaltılamaz varsa, size bir arayüz ile yapamazsınız kod, yeniden bir soyut sınıf gerekebilir anlamına gelir ortak bir davranış olduğunu bir göstergesidir olduğunu.
Başka bir fark ihtiyacınız olduğu bir nesne gibi birçok arabirimleri uygulayabilirsiniz, ancak sırf "elmas sorunu" bir soyut sınıf var olduğunu (bilgi için buraya göz atın neden! http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem)
Herhalde bazı noktaları unutmak, ama şeyleri netleştirmek umuyoruz.
PS: "bir" / Vivek Vermani cevabı tarafından getirilen "yapmalıyım", ben onları sevdim çünkü sadece terimleri yeniden, onun cevabını çalmak istemedim!