คำตอบของฉัน: ตัวเลือกการออกแบบไม่ดี ;-)
นี่คือการอภิปรายที่น่าสนใจที่เน้นผลกระทบทางไวยากรณ์ หลักของการโต้แย้งในมุมมองของฉันคือการตัดสินใจออกแบบนำไปสู่การเรียนคงปิดผนึก มุ่งเน้นไปที่ความโปร่งใสของชื่อคลาสคงที่ปรากฏที่ระดับบนสุดแทนการซ่อน ('สับสน') หลังชื่อลูก? หนึ่งสามารถนึกภาพการใช้ภาษาที่สามารถเข้าถึงฐานหรือเด็กโดยตรงสับสน
ตัวอย่างเทียมสมมติว่าการสืบทอดแบบคงที่ถูกกำหนดในบางวิธี
public static class MyStaticBase
{
SomeType AttributeBase;
}
public static class MyStaticChild : MyStaticBase
{
SomeType AttributeChild;
}
จะนำไปสู่:
// ...
DoSomethingTo(MyStaticBase.AttributeBase);
// ...
ซึ่งสามารถ (จะ?) ส่งผลกระทบต่อการจัดเก็บข้อมูลเช่นเดียวกับ
// ...
DoSomethingTo(MyStaticChild.AttributeBase);
// ...
สับสนมาก!
แต่เดี๋ยวก่อน! คอมไพเลอร์จะจัดการกับ MyStaticBase และ MyStaticChild ที่มีลายเซ็นเดียวกันในทั้งสองวิธีอย่างไร หากเด็กแทนที่ตัวอย่างข้างต้นฉันจะไม่เปลี่ยนที่เก็บข้อมูลเดียวกันหรือไม่? สิ่งนี้นำไปสู่ความสับสนมากยิ่งขึ้น
ฉันเชื่อว่ามีเหตุผลพื้นที่ข้อมูลที่แข็งแกร่งสำหรับการสืบทอดแบบคงที่ จำกัด เพิ่มเติมเกี่ยวกับขีด จำกัด ในไม่ช้า pseudocode นี้แสดงค่า:
public static class MyStaticBase<T>
{
public static T Payload;
public static void Load(StorageSpecs);
public static void Save(StorageSpecs);
public static SomeType AttributeBase
public static SomeType MethodBase(){/*...*/};
}
จากนั้นคุณจะได้รับ:
public static class MyStaticChild : MyStaticBase<MyChildPlayloadType>
{
public static SomeType AttributeChild;
public static SomeType SomeChildMethod(){/*...*/};
// No need to create the PlayLoad, Load(), and Save().
// You, 'should' be prevented from creating them, more on this in a sec...
}
การใช้งานดูเหมือนว่า:
// ...
MyStaticChild.Load(FileNamePath);
MyStaticChild.Save(FileNamePath);
doSomeThing(MyStaticChild.Payload.Attribute);
doSomething(MyStaticChild.AttributeBase);
doSomeThing(MyStaticChild.AttributeChild);
// ...
บุคคลที่สร้างเด็กแบบสแตติกไม่จำเป็นต้องคิดเกี่ยวกับกระบวนการทำให้เป็นอนุกรมตราบใดที่พวกเขาเข้าใจข้อ จำกัด ใด ๆ ที่อาจวางไว้ในเอ็นจินการทำให้เป็นอนุกรมของแพลตฟอร์มหรือสภาพแวดล้อม
Statics (singletons และรูปแบบอื่น ๆ ของ 'globals') มักจะเกิดขึ้นรอบ ๆ ที่เก็บข้อมูลการกำหนดค่า การสืบทอดแบบคงที่จะช่วยให้การจัดสรรความรับผิดชอบประเภทนี้จะแสดงอย่างหมดจดในไวยากรณ์เพื่อให้ตรงกับลำดับชั้นของการกำหนดค่า แม้ว่าอย่างที่ฉันแสดงมีความเป็นไปได้มากมายสำหรับความคลุมเครือขนาดใหญ่หากมีการนำแนวคิดการสืบทอดมรดกพื้นฐานมาใช้
ฉันเชื่อว่าตัวเลือกการออกแบบที่เหมาะสมจะช่วยให้มีการสืบทอดแบบคงที่โดยมีข้อ จำกัด เฉพาะ:
- ไม่มีการแทนที่ของอะไร เด็กไม่สามารถแทนที่แอตทริบิวต์ฐาน, เขตข้อมูล, หรือวิธีการ, ... การบรรทุกเกินควรจะเป็นเรื่องปกติตราบใดที่มีความแตกต่างในการลงนามอนุญาตให้คอมไพเลอร์เพื่อเรียงลำดับ child vs base
- อนุญาตเฉพาะฐานแบบคงที่ทั่วไปคุณไม่สามารถสืบทอดจากฐานแบบคงที่ที่ไม่ใช่แบบทั่วไป
MyStaticBase<ChildPayload>.SomeBaseField
คุณยังสามารถเปลี่ยนสาขาเดิมผ่านการอ้างอิงทั่วไป แต่คุณจะท้อใจเพราะจะต้องระบุประเภททั่วไป ในขณะที่การอ้างอิงของเด็กจะสะอาดกว่า:MyStaticChild.SomeBaseField
ในขณะที่การอ้างอิงที่เด็กจะทำความสะอาด:
ฉันไม่ได้เป็นนักเขียนคอมไพเลอร์ดังนั้นฉันจึงไม่แน่ใจว่าฉันขาดอะไรบางอย่างเกี่ยวกับความยากลำบากในการใช้ข้อ จำกัด เหล่านี้ในคอมไพเลอร์ ที่กล่าวว่าฉันเชื่อว่ามีความต้องการพื้นที่ให้ข้อมูลสำหรับการสืบทอดแบบคงที่ จำกัด และคำตอบพื้นฐานคือคุณไม่สามารถทำได้เนื่องจากตัวเลือกการออกแบบที่ไม่ดี (หรือง่ายกว่า)