Arayüz veya bir Özet Sınıfı: hangisi kullanılır?

8 Cevap php

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?

8 Cevap

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.

En iyi uygulama bunun sadece bir uygulama olarak sözleşme ve soyut sınıfını belirtmek için bir arabirim kullanmaktır. Eğer sadece belirli bir uygulama kullanmak zorlamadan gereken veya istediğiniz kılarak bir uygulama oluşturabilirsiniz böylece soyut sınıf Demirbaş bir sürü doldurabilirsiniz.

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 ...

Ana fark, soyut bir sınıf bir arayüz olamaz oysa varsayılan implmentation içerebilir olduğunu.

Bir arabirim herhangi bir uygulama olmadan davranış bir sözleşmedir.

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!