Ben hepsinin ortak özellikleri ve yöntemleri paylaşmak çünkü ortak bir atadan uzanan çeşitli sınıflar var bir senaryo var. Bu sınıflar (Grup A) yarısı diğer yarısı (B Grubu) tarafından paylaşılmayan bir özellik içerir, bu nedenle A Grubu her bir sınıf açıkça bu özelliği yerine üst sınıf bildirir.
örneğin
class parent
{
}
class child1 <and child2, and child3> extends parent
{
protected $specialProperty;
}
class child4 <and child5, and child5> extends parent
{
// no "$specialProperty"
}
Ben o $specialProperty üzerinde hareket uygulamak için gereken bazı davranışları var. Doğal olarak, bir üst sınıfta bu koymak ve sadece bir kez yapmak istiyorum, ama $specialProperty çocuk sınıflar tüm yok.
Bir seçenek $specialProperty bildirir ve gerekli davranışı uygulayan bir ara, soyut bir sınıf oluşturmak için, ama ben bir kaç nedenden dolayı bunu yapmak için isteksiz değilim:
- Bu senaryo daha yakında olacak. Ben o zaman ne yapacağım? 5 veya 6 farklı kabzımal bu işlevleri her biri için soyut sınıfları oluşturmak?
- Sınıf hiyerarşisi zaten derin üzerinde yaklaşık 5 düzeyleri {[(0)}]. Ben gerçekten sınırlı gereklerine hastefully tasarlanmıştı bir az daha ideal sınıf hiyerarşisi telafi etmek için daha fazla ve daha fazla katman yaratmak olmalıdır?
- En azından bildiğim kadarıyla PHP ile ilgili olarak, miras değil pek çok katmanları da performans sorunlarına yol açacak?
Başka bir seçenek şunları yapmaktır:
class parent
{
public function functionThatTheAppWillCallAutomatically()
{
if ( property_exists($this, 'specialProperty') )
{
// do stuff with specialProperty
}
}
}
"Şeyler" $specialProperty sahip çocuk sınıflar tarafından yürütülen ve olmayanları tarafından atlanır olacaktı. I hate strong> bu çözüm olsa da sadece yanlış ve bana özensiz görünüyor çünkü. Benim görüşüme göre, ebeveyn ne çocuğun özelliklerine göre edersiniz (halt, muhtemelen hatta çocuğun var olduğunu bilmek gerektiğini karar olmamalı - olmadığını ilk etapta çocuk sınıf için nedeni ?)
Kısacası, ben en kötü bu iki seçenekten hangisinin emin değilim, ya da daha iyi bir olasılık varsa. Ben endişeyle önerileri bekliyorum.
Teşekkürler!
EDIT:
Ben bu özel işlevselliğini uygulamak için aşağıdakileri yaparak sona erdi.
class archivalDecorator extends decoratorBase /* decoratorBase just has constructor and the object property */
{
public function archive()
{
if ( !$this->object->archive() )
{
return false;
}
if ( property_exists($this->object, 'specialProperty') )
{
// do extra stuff here that involves "specialProperty"
}
return true;
}
}
Bu şekilde, benim tüm nesnelerin aynı arşiv iş akışını gerçekleştirmek, ama özel bir davranışı gerektiren sınıflar beni hala bu özel durumlar için hiyerarşisinde alt sınıflarından onlarca uygulamaya gerek kalmadan gerçekleştirebilirsiniz.
Hala property_exists(...) özel bir davranış gerekli olup olmadığını belirlemek ya da değil kullanıyorum rağmen, ben üst sınıf içinde yapmıyorum, çünkü bu artık Tamam olduğunu düşünüyorum. $specialProperty bir kamu malı olduğunu, bu nedenle orada dış sınıflar bundan haberi olmamalı hiçbir neden yok, ama bir şey sadece üst sınıf $this kullanarak bir çocuk sınıf içinde bu özellik için denetleme hakkında yanlış hissettim .
Ben kavramı misapplied değil umuyoruz.