Mengapa Java tidak mendukung warisan pribadi / dilindungi seperti C ++? [Tutup]


12

Saat mewarisi kelas dalam C ++, pengguna dapat menentukan specifier akses seperti,

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.
};

Tetapi hal yang sama tidak mungkin di Jawa, yaitu meluas di java selalu seperti warisan "publik" di C ++.

Bisakah seseorang menjelaskan alasannya?


16
Kita tidak perlu alasan untuk menghilangkan fitur, kita perlu alasan (idealnya, beberapa yang bagus) untuk menambahkannya.

1
Ini hanya dapat dijawab secara spekulatif, dengan suara untuk ditutup.
Jimmy Hoffa

Jawaban:


10

Sebagian besar manfaat yang diberikan warisan pribadi / dilindungi dapat Anda peroleh dengan mudah melalui enkapsulasi. Thomas Eding telah memberikan beberapa contoh kasus yang baik yang dapat dibuat lebih mudah dengan penambahan warisan pribadi / dilindungi, dan walaupun ini adalah kasus yang valid, ada solusi yang tidak memerlukan warisan pribadi / dilindungi dan lebih 'idiomatik' (di Jawa pada paling sedikit).

Para pengembang bahasa Jawa jelas merasa bahwa biaya dalam kompleksitas yang diperlukan untuk mendukung warisan pribadi / dilindungi (termasuk multiple inheritance) melebihi manfaat yang akan diberikannya.


1
Perlu dicatat, bahwa dalam C ++ ada beberapa perbedaan penting antara warisan pribadi dan inklusi sebagai anggota, tetapi mereka berputar di sekitar urutan inisialisasi dan multiple inheritance dan dengan demikian tidak diterjemahkan ke dalam sistem objek Java yang lebih sederhana.
Jan Hudec

2
-1: " Setiap manfaat yang diberikan oleh warisan pribadi / dilindungi Anda dapat dengan mudah dicapai melalui enkapsulasi." Salah. Saya setuju dengan " Sebagian besar manfaat ..."
Thomas Eding

@ThomasEding Bisakah Anda memberikan contoh sesuatu yang dapat dicapai melalui warisan pribadi / terlindungi tetapi tidak melalui enkapsulasi (atau setidaknya sesuatu yang akan membutuhkan banyak pekerjaan untuk diselesaikan dengan enkapsulasi)? Jujur saya tidak bisa memikirkan satu, tapi saya terbuka untuk diyakinkan.
pswg

2
Ups, maaf soal itu. Berikut adalah beberapa contoh di C ++. (1) Misalkan Anda ingin secara internal mempertimbangkan kelas Bsebagai A(yang Bdiwarisi secara pribadi dari A) sehingga Anda dapat secara polimorfis menggunakannya dalam beberapa metode. Dengan komposisi, ini bisa dilakukan, tetapi jauh lebih berantakan. Di sini Anda perlu membuat subclass terpisah A'(mungkin kelas dalam) yang mengimplementasikan fungsi yang Anda gunakan. Anda juga perlu mendelegasikan perubahan secara manual ke Bkelas induk ( Bmembuat A'teman, A'menerima referensi untuk B). Saya kira ini tidak terlalu sulit untuk dilakukan, tetapi membuat kode berantakan. (Lanjutan)
Thomas Eding

2
... (2) Jika Anda ingin Bmengakses variabel yang dilindungi A, warisan pribadi lebih mudah diterapkan daripada komposisi. Dengan komposisi, Anda dapat menerapkan hal yang A'sama seperti di atas, dan / atau meningkatkan akses variabel yang dilindungi. (3) Misalkan Anda ingin variabel anggota statis bersama tunggal yang merupakan variabel tepat yang sama di seluruh contoh template. Solusinya adalah dengan mewarisi secara pribadi dari kelas dasar non-templated yang memiliki anggota statis. Komposisi tidak dapat menyelesaikan masalah ini, meskipun teknik lain bisa (seperti berteman dengan beberapa kelas lain dengan anggota).
Thomas Eding

9

Karena Java tidak memiliki banyak warisan dan semuanya harus (secara publik) diwarisi Object, tidak ada tempat di Jawa di mana warisan pribadi atau yang dilindungi akan menghasilkan program yang valid.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.