Php parametre türleri değişen bir miras tasarımı nasıl?

1 Cevap php

Fikir DOM gibi bir ağaç oluşturmak için. Ancak bazı kısıtlamalar sadece belirli tip aslında diğer içerebilir ki, vardır.

Appendchild, replaceChild vb gibi bazı iyi bilinen js-fonksiyonları uygulamak için superclass | soyut sınıf | Ben bir arabirim kullanmak istiyorum

Ben sayfaları blokları içerebilir ve blokları blokları veya öğe içerebilir sınıfları sayfa, blok ve öğeyi, kullanıyorum.

Örnek: Sayfa Bir web sayfası, blok bir liste öğesi olabilir ve öğe bir liste öğesi unsur olabilir.

Ancak bu nesneleri sadece html-verilerinden daha fazlasını içeren ve kavramlar sadece düz HTML temsil ötesine geçer. It's an overall idea of managing items, wether they have an actual representation or are just abstract objects. The concept itself works for many different hierarchies.

Ne elde etmek istiyorum (bir çocuk ekleyerek tüm sınıflar için temelde aynıdır) mümkün olduğunca üst sınıf çok kod yeniden ama tip bir çocuk olarak eklemek için izin verilen türleri maç için ipuçları farklılık olduğunu.

Ben kendim buldum dört yolu vardır:

  1. Bana üst sınıfa ipucu yazın ama bu değiştirmek için değil sağlayan bir arabirim kullanın.
  2. Ben kamu yöntemleri ile bir üst sınıfı kullanmak, bu yüzden (önkoşulları heriting zaman olağan uygulamalara tamamen karşı olan) tipi ipuçlarını yeniden tanımlayabilirsiniz.
  3. Ben hala oldukça ilginç olmanın görünüyor, korumalı yöntemleri ile bir üst sınıfı kullanın.
  4. Ben herhangi bir üst sınıftan kurtulmak ve sadece hemen hemen aynı sınıf defalarca tanımlamak olsun.
  5. Ben tür ipuçları özelliği rağmen, türü kontrol etmek için bir yöntem kullanabilirsiniz.

Herkes hala cevaplamak için istekli olup olmadığını Yani, herhangi bir önerme, fikir ya da ipucu, seçim seçeneği için mutluyum. Ben yeterince sorunu tarif olabilir umuyoruz.

Ben cevapsız bir şey varsa ve bunu duymak için minnettarım ;)

Code

Superclass yolu (çalışıyor, ama sonları devralmasını uygulama ön koşul)

class Base {

    public|protected function appendChild(Base $child) {
        // do stuff
    }
}

class Block extends Base {

   public function appendChild(Block $child) {
       parent::appendChild($child);
   }

}

Arayüz yolu (çalışmaz. Değil gerekir)

interface Interface1 {

    public function appendChild(Base $child);

}

class Base implements Interface1 {

    public|protected function appendChild(Base $child) {
        // do stuff
    }
}

class Block extends Base{

   public function appendChild(Block $child) {
       parent::appendChild($child);
   }

}

Edited parts are bold

1 Cevap

Arayüz bana en mantıklı. Birden arabirimleri uygulamak gibi, birden fazla rol oynuyor bir sınıf olabilir.

// you don't need any methods in the interfaces
class Foo implements Inline, Block {} 

hem de çalışacak:

appendChild(Inline $foo); and appendChild(Block $foo);

ve arayüzleri birbirlerine uzatabilirsiniz, böylece tüm nesneler için ortak bir arayüz olabilir.

Hala uygulanmasını yeniden devralma kullanabilirsiniz ve kesinlikle uygulanması yeniden kullanım için inhertiance ağacını kullanmak için esneklik gerekir, (eğer StaticSimpleton {uzatmak yapmak zorunda asla sizin sayfa mantığı ile sınırlı değildir [ (1)]}).

Değil arayüzleri, ben 5. seçeneği için gitmek istiyorum: sadece appendChild çağrı $child->canBeChildOf($this) yapmak ve / veya $this->accepts($child). Yine, mantık ve uygulama bağımsız olacak, ve size mantığı ile çok fazla özgürlük olacak.

PHP çalıştırma TMIE denetimlerini yazın yapar, böylece tip sistemin kullanımı zaten size çok satın almaz.