ทำไม Java ไม่สนับสนุนการสืบทอดส่วนตัว / ที่ป้องกันเช่น C ++ [ปิด]


12

ในขณะที่สืบทอดคลาสใน 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.
};

แต่สิ่งเดียวกันนั้นไม่สามารถทำได้ใน Java เช่นการขยายใน java มักจะเหมือนกับการสืบทอด "สาธารณะ" ใน C ++

มีคนอธิบายเหตุผลนี้ได้ไหม


16
หนึ่งไม่ต้องการเหตุผลในการละเว้นคุณสมบัติหนึ่งต้องการเหตุผล (นึกคิดดีหลายคน) เพื่อเพิ่ม

1
สามารถตอบได้อย่างนี้เฉพาะการลงคะแนนเพื่อปิด
Jimmy Hoffa

คำตอบ:


10

ประโยชน์ส่วนใหญ่ที่การสืบทอดส่วนตัว / ที่ได้รับการปกป้องจะทำให้คุณประสบความสำเร็จได้อย่างง่ายดายผ่านการห่อหุ้ม Thomas Edingได้ให้ตัวอย่างที่ดีบางอย่างของกรณีที่สามารถทำได้ง่ายขึ้นด้วยการเพิ่มมรดกส่วนตัว / ป้องกันและในขณะที่กรณีเหล่านี้เป็นกรณีที่ถูกต้องมีวิธีแก้ไขปัญหาที่ไม่ต้องใช้มรดกส่วนตัว / ป้องกันและเป็น 'สำนวน' เพิ่มเติม น้อยที่สุด).

นักพัฒนาของภาษาจาวาเห็นได้ชัดว่าค่าใช้จ่ายในความซับซ้อนที่จำเป็นในการสนับสนุนมรดกส่วนตัว / ป้องกัน (รวมถึงมรดกหลาย) เกินดุลประโยชน์ที่จะให้


1
เป็นที่น่าสังเกตว่าใน C ++ มีความแตกต่างที่สำคัญบางประการระหว่างการรับมรดกส่วนตัวและการรวมเป็นสมาชิก แต่พวกมันหมุนไปตามลำดับของการเริ่มต้นและการสืบทอดหลายครั้งดังนั้นจึงไม่แปลเป็นระบบวัตถุที่เรียบง่ายของ Java
Jan Hudec

2
-1: " ผลประโยชน์ใด ๆที่การสืบทอดแบบส่วนตัว / ที่ได้รับการป้องกันจะทำให้คุณสามารถทำได้อย่างง่ายดายผ่านการห่อหุ้ม" ไม่ถูกต้อง. ฉันจะเห็นด้วยกับ " ผลประโยชน์มากที่สุด ... "
โทมัส Eding

@ThomasEding คุณสามารถยกตัวอย่างของสิ่งที่สามารถทำได้ผ่านการรับมรดกส่วนตัวหรือการป้องกัน แต่ไม่ใช่ผ่านการห่อหุ้ม ฉันไม่สามารถคิดได้อย่างจริงใจ แต่ฉันเปิดใจที่จะเชื่อมั่น
pswg

2
อ๊ะขอโทษด้วยนะ นี่คือตัวอย่างบางส่วนใน C ++ (1) สมมติว่าคุณต้องการพิจารณาคลาสภายในBเป็นA( Bสืบทอดโดยส่วนตัวA) เพื่อให้คุณสามารถใช้รูปแบบได้หลายวิธี ด้วยการแต่งเพลงสิ่งนี้สามารถทำได้ แต่มันก็ยุ่งกว่ามาก ที่นี่คุณจะต้องสร้างคลาสย่อยแยกต่างหากA'(อาจเป็นคลาสภายใน) ที่ใช้ฟังก์ชันที่คุณใช้ นอกจากนี้คุณยังจะต้องมอบหมายการเปลี่ยนแปลงให้กับBชั้นผู้ปกครองด้วยตนเอง( Bทำให้A'เพื่อนA'ยอมรับการอ้างอิงถึงB) ฉันคิดว่ามันไม่ยากเกินไปที่จะทำ แต่มันเกิดความยุ่งเหยิงในรหัส (ต่อ)
โทมัส Eding

2
... (2) ถ้าคุณต้องการBเข้าถึงตัวแปรที่ได้รับการปกป้องการAสืบทอดส่วนตัวนั้นง่ายกว่าที่จะนำไปใช้ในการจัดองค์ประกอบ ด้วยการเรียบเรียงคุณสามารถนำไปใช้A'ในทำนองเดียวกันข้างต้นและ / หรือเพิ่มการเข้าถึงของตัวแปรที่ได้รับการป้องกัน (3) สมมติว่าคุณต้องการตัวแปรสมาชิกแบบคงที่ที่ใช้ร่วมกันซึ่งเป็นตัวแปรที่แน่นอนเหมือนกันทั่วทั้งอินสแตนซ์แม่แบบ วิธีแก้ไขคือการสืบทอดจากคลาสพื้นฐานที่ไม่ได้ templated ที่มีสมาชิกแบบสแตติก องค์ประกอบไม่สามารถแก้ปัญหานี้ได้แม้ว่าเทคนิคอื่น ๆ จะทำได้ (เช่นการเป็นเพื่อนกับชั้นเรียนอื่นกับสมาชิก)
Thomas Eding

9

เนื่องจาก Java ไม่ได้มีการสืบทอดหลายอย่างและทุกสิ่งจะต้องได้รับการสืบทอดจากสาธารณะObjectจึงไม่มีสถานที่ใน Java ที่การสืบทอดส่วนตัวหรือการป้องกันจะให้โปรแกรมที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.