Ne zaman uygulanmalı ve genişletilmeli? [kapalı]


91
  • Ne zaman kullanılmalı implementveya extendkullanılmalıdır?
  • Bazı gerçek dünya örnekleri nelerdir?

Bu doğru mu?

Uygulama , belirli yöntemlerin bir sınıfta var olduğunu ve bu yöntemlerin işlev çağrılarının düzgün şekilde biçimlendirildiğini zorlamanın bir yolu gibi görünmektedir. Uygulama değişkenleri veya "ayarları" sınıfa aktarmanın bir yolu değil mi?

Beklenen gerçek hayat senaryosu: Hepsi aynı tasarımı izleyen birden çok ödeme sınıfına sahip bir e-ticaret platformum var. Yeni bir ödeme sınıfı eklenmesi gerektiğinde interface, tüm parçaların ve parçaların baştan orada olmasını sağlamak için tanımlanmış tasarımını takip etmek gerçekten çok kolaydır .

Genişletme yöntemlerden & değişkenler hariç, üst sınıfından sınıf devralır her şey olarak ilan genişletilmiş (? Çocuk) sınıfları yapar private?

Beklenen gerçek hayat senaryosu: ve sessionsadlı iki alt sınıfla çağrılan bir sınıfım var . ve birlikte üst oturumlarından bir dizi karşılıklı yapılandırma seçeneğini devralır, bu da her türden nihai ziyaretçi veri depolamasını etkileyecek bir yapılandırma seçeneğini değiştirmeyi kolaylaştırır.sessioncookiesdatabasesessionssessioncookiesdatabasesessions


1
Miras konusunda okumanı tavsiye ederim.
Rafe Kettler

Yanıtlar:


64

Devralma, yeniden yazdığınız kod miktarını azaltmak için kullanışlıdır. Birkaç ortak yöntem veya alana sahip birkaç sınıfınız varsa, bu yöntemleri ve alanları defalarca tanımlamak yerine, bunları bir temel sınıfa çarpanlara ayırabilir ve her alt sınıfın bu temel sınıfı genişletmesini sağlayabilirsiniz.

implementsOrtak bir protokol tanımlamak istediğinizde arayüzler (ve ) kullanışlıdır bir nesne grubunun nasıl davranması gerektiğine ilişkin . Örneğin, karşılaştırılabilir nesnelerin eşitlik ve karma, vb. Açısından karşılaştırılabileceğini zorunlu kılmak isteyebilirsiniz.

Kalıtımın kullanılması nihayetinde bir tasarım seçimidir. Aynı yöntemleri birkaç sınıfta tanımladığınız durumlara dikkat edin; bunlar, bu yöntemleri temel bir sınıfa ayırabileceğiniz mükemmel durumlardır. Aynı özelliklerin bazılarını gözlemleyen sınıflar için de aynı şey geçerlidir: Bu özellikleri ilgili sınıflar tarafından uygulanacak bir arayüze yerleştirerek tutarlılığı garanti edebilirsiniz.

Kalıtım, OOP'de PHP'nin ötesine geçen büyük bir kavramdır. Kalıtım ve belki de Dörtlü Çete'nin Tasarım Modelleri hakkındaki wikipedia makalesini okumanızı tavsiye ederim .

Miras anlayışınızın esas olarak doğru olduğuna inanıyorum. Bir sonraki adım, onu üretimde kullanmak olacaktır.


4
Pek çok insan artık The Gang of Four kitabının malzeme açısından çok ağır olduğunu tasarım kalıplarına bir giriş olarak görüyor. Popüler bir alternatif, daha hafif okuma sağlayan Head First: Design Patterns. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"Aynı yöntemleri birkaç sınıfta tanımladığınız durumlara dikkat edin; bunlar, bu yöntemleri bir temel sınıfa ayırabileceğiniz mükemmel durumlardır." Bir Sınıfı genişletmenin, bu yöntemleri tanımlamak için bir Özelliği kullanmaya göre bir faydası olur mu?
Daniel Weiner

1
"Devralma, yeniden yazdığınız kod miktarını azaltmak için kullanışlıdır" - Devralmanın amacı, kodu değil davranışı paylaşmaktır. Mümkün olduğunda özellikler, soyut bir sınıfı başka türlü ortak hiçbir yanı olmayan somut sınıflarla genişletmek yerine kodu paylaşmanın yoludur. Genellikle sınıflarınızı bir-bir-bir-bir-ilişkisi olarak da modelleyebilirsiniz, bu da hem kodun yeniden kullanılabilirliğini hem de çok biçimliliği daha da kolaylaştıracaktır.
Duncan

14

Uygulama:

Arayüzler soyut sınıflardır, bu nedenle yalnızca bir şeyler bildirebilirsiniz. Bir sınıf bir arabirim uygular. Birden çok arayüz uygulayabilirsiniz .

Uzatın:

Bir sınıfın daha spesifik bir versiyonunu istediğinizde sınıfları genişletirsiniz .

Misal:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

Hem Deve hem de Köpek hayvanlardır, bu yüzden Animalsınıfları uzatırlar . Ancak yalnızca Köpek belirli bir türdür ve Animalbu da birPet

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.