Bunlar, özellikle bu alanda çok farklı dillerdir. Diyelim ki bir sınıfınız var. Bu durumda, onu bir metin kutusu gibi bir kullanıcı kontrolü yapalım. UIControl olarak adlandırın. Şimdi bunu başka bir sınıfa koymak istiyoruz. Bu durumda, örneğimiz için bir UI kullandığımız için bunu CleverPanel sınıfı olarak adlandıracağız. CleverPanel örneğimiz, UIControl örneğinde gerçekleşen olayları çeşitli nedenlerle bilmek isteyecektir. Bu nasıl yapılır?
C # 'da, temel yaklaşım, her bir ilginç olay tetiklendiğinde uygulanacak yöntemleri ayarlayarak çeşitli Olayları kontrol etmektir. Olaylardan yoksun olan Java'da olağan çözüm, çeşitli "olay" işleme yöntemlerine sahip bir nesneyi bir UIControl yöntemine iletmektir:
boolean stillNeedIt = ... ;
uiControl.whenSomethingHappens( new DoSomething() {
public void resized( Rectangle r ) { ... }
public boolean canICloseNow() { return !stillNeedIt; }
public void closed() { ... }
...
} );
Şimdiye kadar, C # ve Java arasındaki fark derin değil. Bununla birlikte, C # 'da gerekli olmayan DoSomething arayüzüne sahibiz. Ayrıca, bu arayüz çoğu zaman ihtiyaç duyulmayan birçok yöntem içerebilir. C # 'da, biz sadece bu olayla ilgilenmiyoruz. Java'da, tüm arayüz yöntemleri, DoSomethingAdapter için boş bir uygulama sağlayan bir sınıf oluşturuyoruz. Şimdi DoSomething'i DoSomethingAdapter ile değiştiriyoruz ve temiz bir derleme için hiçbir yöntem yazmamız gerekmiyor. Programın doğru çalışması için ihtiyaç duyduğumuz yöntemleri geçersiz kılıyoruz. Bu yüzden bir arayüze ihtiyacımız var ve Java # 'da miras kullanarak C # olaylarıyla yaptığımız şeyle eşleşiyoruz.
Bu bir örnek, kapsamlı bir tartışma değil, fakat Java'da C # ile karşılaştırıldığında neden bu kadar kalıtımsallık olduğunun temellerini veriyor.
Şimdi, Java neden bu şekilde çalışıyor? Esneklik. Nesne, SomethingHappens'in CleverPanel'e başka bir yerden tamamen geçilmiş olabileceği zamana geçti. Bir CleverPanel örneğinin bir yerde bir CleverWindow nesnesine yardımcı olmak için UIControl benzeri nesnelerine iletmesi gereken bir şey olabilir. Veya UIControl birine bunu bırakabileceğini söyledi onun bileşenleri.
Ayrıca, bir adaptör yerine, arkasında binlerce kod satırı bulunan bir DoSomething uygulaması olabilir. Biz yeni bir örneğini oluşturabilir o ve onu geçmektedir. Bir yöntemi geçersiz kılmamız gerekebilir. Java'daki yaygın bir püf noktası, şöyle bir yöntemle büyük bir sınıfa sahip olmaktır:
public class BigClass implements DoSomething {
...many long methods...
protected int getDiameter() { return 5; }
}
Sonra CleverlPanel'de:
uiControl.whenSomethingHappens( new BigClass() {
@Override
public int getDiameter() { return UIPanel.currentDiameter; }
} );
Açık kaynak kodlu Java Platformu, programcıları daha fazlasını yapmaya itme eğiliminde olan bir çok şey yapıyor; çünkü her ikisi de bunu örnek olarak ve basitçe kullanmak için takip ediyorlar. Ben dilinin temel tasarım Sun'ın çerçeve tasarımı arkasında olduğunu düşünüyorsunuz ve ne zaman Java programcısı en tekniklerini kullanarak arkasında değil çerçevesini kullanarak.
Java anında anında bir sınıf oluşturmak çok kolaydır. Adsız veya adlandırılmış sınıfa yalnızca tek bir yöntemde gömülü olan küçük bir kod bloğunda başvurulabilir. Tamamen yeni veya çok büyük, mevcut bir sınıfa hafif değişiklikler yaparak yaratılabilir. (Ve varolan sınıf kendi dosyasında üst düzey olabilir veya üst düzey bir sınıfta yer alabilir veya yalnızca tek bir kod bloğunda tanımlanabilir). Yeni sınıf örneği, oluşturulan tüm nesnenin verilerine tam erişebilir. Ve yeni örnek, onu yaratan nesneyi temsil ederek programın her tarafında geçirilebilir ve kullanılabilir.
(Bir kenara, burada kalıtımın büyük bir kullanımının - Java'nın diğer yerlerinde olduğu gibi - sadece DRY amaçları için olduğunu unutmayın. Farklı sınıfların aynı kodu yeniden kullanmalarına izin verir. Ayrıca, Java'da kalıtım kolaylığı olduğunu da unutmayın. )
Yine, bu kapsamlı bir tartışma değil; Sadece buradaki yüzeyi çiziyorum. Ancak evet, Java ve C # arasında kalıtımın nasıl kullanıldığı konusunda şaşırtıcı bir fark var. Onlar bu açıdan çok farklı dillerdir. Bu senin hayal gücün değil.