Java neden C ++ gibi özel / korumalı mirası desteklemiyor? [kapalı]


12

C ++ 'da bir sınıfı devralırken kullanıcı,

class Base
{
    public int mem1;
    protected in mem2;
};

class Derived1 : **private** Base
{
    // mem1 will be private here.
    // mem2 will be private here.
};

class Derived2 : **protected** Base
{
    // mem1 will be protected here.
    // mem2 will be protected here.
};

class Derived2 : **public** Base
{
    // mem1 will be public here.
    // mem2 will be protected here.
};

Ancak Java'da da aynı şey mümkün değildir, yani java'da genişletme her zaman C ++ 'da "genel" kalıtım gibidir.

Birisi bunun nedenini açıklayabilir mi?


16
Bir kişinin bir özelliği atlaması için bir nedene ihtiyacı yoktur, bir özelliği eklemek için bir nedeni (ideal olarak birkaç iyi özelliği) gerekir.

1
Bu sadece spekülatif olarak cevaplanabilir, kapanış oyu verilebilir.
Jimmy Hoffa

Yanıtlar:


10

Özel / korumalı mirasın size sağladığı faydaların çoğu kapsülleme yoluyla kolayca elde edilebilir. Thomas Eding , özel / korumalı mirasın eklenmesiyle daha kolay hale getirilebilecek bazı iyi örnekler vermiştir ve bunlar geçerli durumlar olsa da, özel / korumalı miras gerektirmeyen ve daha 'deyimsel' olan geçici çözümler mevcuttur (Java'da en az).

Java dilinin geliştiricileri, özel / korumalı mirasın (çoklu miras dahil) desteklenmesi için gereken karmaşıklık maliyetinin sağlayacağı faydadan daha ağır bastığını açıkça belirtti.


1
C ++ 'da üye olarak özel kalıtım ve dahil olma arasında bazı önemli farklar olduğunu, ancak başlatma sırası ve çoklu kalıtım etrafında döndüklerini ve dolayısıyla Java'nın daha basit nesne sistemine dönüşmediğini belirtmek gerekir.
Jan Hudec

2
-1: " Özel / korumalı mirasın size sağladığı herhangi bir fayda, kapsülleme yoluyla kolayca elde edilebilir ." Yanlış. İle kabul edeceğini " En faydaları ..."
Thomas Eding

@ThomasEding Özel / korumalı kalıtım yoluyla elde edilebilecek, ancak kapsülleme yoluyla (veya en azından kapsülleme ile başarmak için iyi bir iş gerektiren bir şey) bir örnek verebilir misiniz? Dürüst olmak gerekirse birini düşünemiyorum, ama ikna olmaya açıkım.
pswg

2
Hata! Üzgünüm. İşte C ++ ile ilgili bazı örnekler. (1) Sınıfı dahili Bolarak A( Bözel olarak devralınan A) olarak değerlendirmek istediğinizi varsayalım , böylece onu bazı yöntemlerde polimorfik olarak kullanabilirsiniz. Kompozisyon ile bu yapılabilir, ancak çok daha karışıktır. Burada A', kullandığınız işlevselliği uygulayan ayrı bir alt sınıf (muhtemelen bir iç sınıf) oluşturmanız gerekir . Elle de ebeveyn değişiklikleri temsilci gerekir Bsınıfı ( Bkılan A'bir arkadaş, A'bir başvuru kabul B). Sanırım bu yapmak çok zor değil, ama kodda bir karmaşaya neden olur. (Devam)
Thomas Eding

2
... (2) BKorumalı değişkenlere erişmek istiyorsanız A, özel devralma, kompozisyon üzerinden uygulanması daha kolaydır. Kompozisyon ile, A'yukarıdaki gibi benzer şekilde uygulayabilir ve / veya korumalı değişkenlerin erişimini artırabilirsiniz. (3) Şablon örneklemeleri arasında aynı değişken olan tek bir paylaşılan statik üye değişken istediğinizi varsayalım. Bir çözüm, statik üyeye sahip temperlenmemiş bir temel sınıftan özel olarak miras almaktır. Kompozisyon bu sorunu çözemez, ancak diğer teknikler de olabilir (örneğin başka bir sınıfın üyeyle arkadaş olması gibi).
Thomas Eding

9

Java'nın birden fazla mirası olmadığı ve her şeyin (kamuya açık olarak) miras alınması gerektiğinden Object, Java'da özel veya korumalı mirasın geçerli bir program vereceği yerler yoktur.

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.