Windows Forms / Swing çerçeveleri neden Kompozisyon yerine kalıtımdan yana?


12

Bugün bir profesörüm, SWT'nin felsefesinin kompozisyonla kendi kontrollerinizi yapmaktan biri olmasına rağmen, Swing'in mirastan yana olduğunu görmenin garip olduğunu söyledi.

Her iki çerçeveyle neredeyse hiç temasım yok, ancak C # 'ın Windows Formlarında hatırladığım kadarıyla, genellikle Swing gibi kontrolleri genişletiyor.

Genelde insanlar kompozisyonu kalıtım yerine tercih etme eğilimindeyken, Swing / Windows Forms kullanıcıları miras yerine kompozisyonu tercih etmediler?


2
Bu API'lerin bulunduğu 15-20 yılda çok şey değişti! Rendering motorları, ekran nesnelerini "gün içinde" herhangi bir keyfi beton sınıfının örneklerine bağlamak için sihirli XML yapıştırıcısına sahip değildi;)

1
Gördüğüm çoğu Swing kodu kompozisyona göre uzantı kullanıyor. Prof'inizin verilerini nereden aldığından emin değilim.

Ben kendimi kompozisyon yerine kalıtım ile net bir sürü salıncak gördüm - çoğunlukla öğreticiler olsa. ancak windows formları gerçekten sadece kalıtımla kullanılır!
elysium

Yanıtlar:


7

JComponentortaya işlevselliği bir sürü . Bir JComponentarabirim olsaydı ve bileşenler kompozisyonla uygulandıysa, basit bileşenlerin düzinelerce önemsiz yöntem sarmalayıcısına, ör.

class MyComponent implements JComponent {
    JPanel panel;
    public boolean contains(int x, int y) {
        return panel.contains(x, y);
    }
    ...
}

Kompozisyona göre kalıtımı tercih etmenin bir verimlilik nedeni de var - geçersiz kılmanın hiçbir maliyeti yoktur ( superçağrı yapılmadığı varsayılırken ), kompozisyon ekstra ücrete tabidir INVOKEVIRTUAL. Bunun Swing'in tasarımını etkileyip etkilemediğini bilmiyorum, ancak koleksiyon sınıfları için büyük bir endişe.


2

Salıncak Çerçevesi aslında Kompozit Tasarım Desenine göre tasarlanmıştır. Orada çok fazla miras olduğu kabul edildi, ancak genellikle kompozisyon kullanarak kendi formlarınızı oluşturursunuz. Yani bir form, orta seviye kapların ve kontrollerin bir bileşimidir.


"Yani bir form, orta seviye konteynerlerin ve kontrollerin bir bileşimidir." Elbette. Ama genellikle gördüğüm şey, insanlar kendi pencerelerini (veya Swing'de ne denirse) oluşturmak istediklerinde, kompozisyon kullanmak yerine bir pencere sınıfından miras alacaklar.
elysium

@devoured elysium Bu doğru. Ancak formu oluşturmak için kompozisyon kullanırlardı. Bu yüzden biraz miras ve bir sürü kompozisyon.

@devoured, bence bu, kullandıkları öğreticinin en iyi uygulamayı takip etmediğini fark etmeyen bir durumdur, çünkü kısalık lehine.
Peter Taylor

1

Java ile, her şey sanal olduğu için miras kullanmak çok daha kolay . JTable / JFrame'deki bir "özelliği" düzeltmeniz mi gerekiyor? Uzatın, sorun yöntemlerini geçersiz kılın ve ardından Tablo / Çerçevenizi bunun yerine her yerde kullanın.

Veri bağlamanın tasarımın birincil özelliği olduğu WPF gibi şeylerle, kalıtım yerine kompozisyon yapmayı çok daha kolay hale getirdiğini düşünüyorum.


"Her şey sanaldır " ile ne demek istiyorsun ?
Jonas

Java'da her yöntem örtük olarak sanaldır (geçersiz kılınabilir). C # 'da, bir yöntemi açıkça olarak bildirmeniz virtualve geçersiz kılmak için açıkça bir olarak bildirmeniz gerekir override. Java'da, görebileceğiniz her şeyi geçersiz kılabilir ve bir alt sınıftaki görünürlüğünü artırabilirsiniz (korumalı yöntemleri bir alt sınıfta herkese açık hale getirebilirsiniz!)
John Gardner

finalTemel sınıf olmasa bile, Java'daki bir yöntemi geçersiz kılamayacağınızı unutmayın final.
perp

bu doğru @perp. ama java'da sanal olanı önlemek için kendi yolundan çıkmalısın (final ekleyerek) . C # tersi, sanal olmak için kendi yolumdan gitmek zorunda . Ve standart java çalışma zamanının çok küçük bir yüzdesi son olarak işaretlenmiştir.
John Gardner

1

In Etkili Java , Madde 17, Bloch bir sınıf bahseder tasarlanmış miras için "geçersiz kılınabilir yöntemleri kendiliğinden kullanımını belgelemek zorundadır." Bunun ayırt edici özelliği bu uygulamanın ifadesidir . Sen gibi sınıflarında görürsünüz JTableve JInternalFrame. Swing tasarımıyla kalıtımın bir ölçüsü.


-2

C # 3.5'ten itibaren, kompozisyon kavramına mirastan daha fazla olanak sağlayan Genişleme Yöntemleri olarak adlandırılan bir kavramımız var.

Bu süreçte, sadece yeni özelliği mevcut sınıfa dönüştüren bir uzantı sınıfı ekleyerek mevcut bir sınıfa genişletilmiş bir işlevsellik uygularız.

Daha fazla ayrıntı için buraya başvurabilirsiniz


Yeni WinForms Control sınıfları oluşturmanın önemini görmüyorum. Açıklayabilir misiniz?
Peter Taylor

@Peter: Bu yalnızca windows form sınıflarıyla ilgili değildir. Bu, kodumuzdan da uygulanabilir. Sadece statik bir sınıf ekleyip daha sonra 1. bağımsız değişkeni ile yeni bir yöntem ekleyerek mevcut sınıfın herhangi birini genişletebilirsiniz, böylece temel nesneye bağlanabilir. Kodu derledikten sonra, yeni eklenen yöntemi temel sınıfın bir yöntemi olarak alırsınız. Kompozisyonun belirttiği şey budur. umarım haklıyım ..
Saravanan

1
Uzantı yöntemlerinin ne olduğunu biliyorum ve zaman zaman oldukça kullanışlılar, ancak bu soru yeni sınıflar oluşturmak için farklı yaklaşımlar hakkında.
Peter Taylor

@Peter: O zaman sadece kısmi sınıfların kullanımına işaret edebilirim, bunun dışında benim anlayışımın C # başka bir özelliği yok. Eğer herhangi birini biliyorsanız, lütfen bana bildirin.
Saravanan
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.