Java ทำให้ความแตกต่างที่ชัดเจนระหว่างและclass
interface
(ฉันเชื่อว่า C # ทำเช่นนั้น แต่ฉันไม่มีประสบการณ์ด้วย) เมื่อเขียน C ++ อย่างไรก็ตามไม่มีภาษาบังคับให้แยกความแตกต่างระหว่างคลาสและส่วนต่อประสาน
ดังนั้นฉันมักจะดูอินเตอร์เฟซเป็นวิธีแก้ปัญหาสำหรับการขาดการสืบทอดหลายใน Java การทำให้ความแตกต่างดังกล่าวให้ความรู้สึกโดยพลการและไร้ความหมายใน C ++
ฉันมักจะไปกับวิธีการ "เขียนสิ่งต่าง ๆ ในวิธีที่ชัดเจนที่สุด" ดังนั้นใน C ++ ฉันมีสิ่งที่เรียกว่าส่วนติดต่อใน Java เช่น:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
และฉันก็ตัดสินใจว่าผู้ดำเนินการส่วนใหญ่Foo
ต้องการแบ่งปันฟังก์ชั่นทั่วไปบางอย่างที่ฉันอาจจะเขียน:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() {}
protected:
// If it needs this to do its thing:
int internalHelperThing(int);
// Or if it doesn't need the this pointer:
static int someOtherHelper(int);
};
ซึ่งทำให้สิ่งนี้ไม่ใช่ส่วนติดต่อในความหมายของ Java อีกต่อไป
C ++ มีสองแนวคิดที่สำคัญซึ่งเกี่ยวข้องกับปัญหาการสืบทอดพื้นฐาน:
virtual
inhertianceคลาสที่ไม่มีตัวแปรสมาชิกสามารถครอบครองพื้นที่พิเศษเมื่อใช้เป็นฐาน
"subobjects คลาสพื้นฐานอาจมีขนาดเป็นศูนย์"
ในบรรดาที่ฉันพยายามหลีกเลี่ยง # 1 เป็นไปได้ - มันยากที่จะเผชิญหน้ากับสถานการณ์ที่จริง ๆ คือการออกแบบที่ "สะอาด" แต่ความแตกต่างที่สำคัญระหว่างความเข้าใจของฉันเกี่ยวกับคำว่า "อินเทอร์เฟซ" และคุณลักษณะภาษา C ++ ด้วยเหตุนี้ในปัจจุบันฉัน (เกือบ) ไม่เคยอ้างถึงสิ่งต่าง ๆ ว่า "อินเทอร์เฟซ" ใน C ++ และพูดในแง่ของคลาสพื้นฐานและขนาดของมัน ฉันจะบอกว่าในบริบทของ C ++ "interface" เป็นชื่อเรียกผิด
มันมาถึงความสนใจของฉันแม้ว่าจะมีไม่กี่คนที่ทำให้ความแตกต่างดังกล่าว
- ฉันทนต่อการสูญเสียสิ่งใดโดยอนุญาตให้ (เช่น
protected
)virtual
ฟังก์ชันที่ไม่ใช่อยู่ใน "ส่วนต่อประสาน" ใน C ++ หรือไม่ (ความรู้สึกของฉันเป็นสิ่งที่ตรงกันข้าม - เป็นตำแหน่งที่เป็นธรรมชาติมากขึ้นสำหรับรหัสที่แชร์) - คือ "อินเตอร์เฟซ" คำที่มีความหมายในภาษา C ++ - ไม่ได้บ่งบอกถึงเพียงบริสุทธิ์
virtual
หรือมันจะยุติธรรมโทรเรียน c ++ ไม่มีตัวแปรสมาชิกอินเตอร์เฟซที่ยัง?
~Foo() {}
ในระดับนามธรรมเป็นข้อผิดพลาดภายใต้ (เกือบ) ทุกสถานการณ์
internalHelperThing
สามารถจำลองในเกือบทุกกรณี