ฉันมีคลาสฐานนามธรรมและฉันต้องการประกาศเขตข้อมูลหรือคุณสมบัติที่จะมีค่าแตกต่างกันในแต่ละคลาสที่สืบทอดจากคลาสพาเรนต์นี้
ฉันต้องการกำหนดใน baseclass เพื่อให้ฉันสามารถอ้างอิงได้ในวิธีการเรียนฐาน - ตัวอย่างเช่นการเอาชนะ ToString จะพูดว่า "วัตถุนี้เป็นประเภททรัพย์สิน / เขต " ฉันมีสามวิธีที่ฉันสามารถเห็นการทำเช่นนี้ แต่ฉันสงสัยว่า - วิธีที่ดีที่สุดหรือยอมรับในการทำเช่นนี้คืออะไร? คำถามมือใหม่ขออภัย
ตัวเลือกที่ 1:
ใช้คุณสมบัตินามธรรมและแทนที่บนคลาสที่สืบทอด ประโยชน์ที่ได้รับจากการบังคับใช้ (คุณต้องลบล้าง) และสะอาด แต่มันรู้สึกผิดเล็กน้อยที่จะส่งคืนค่ารหัสฮาร์ดโค้ดแทนการห่อหุ้มฟิลด์และเป็นโค้ดสองสามบรรทัดแทนที่จะเป็นเพียงฟิลด์ ฉันยังต้องประกาศร่างสำหรับ "ชุด" แต่มันมีความสำคัญน้อยกว่า (และอาจมีวิธีที่จะหลีกเลี่ยงสิ่งที่ฉันไม่ทราบ)
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
ตัวเลือก 2
ฉันสามารถประกาศเขตข้อมูลสาธารณะ (หรือเขตข้อมูลที่มีการป้องกัน) และแทนที่มันอย่างชัดเจนในชั้นเรียนที่สืบทอด ตัวอย่างด้านล่างจะให้คำเตือนแก่ฉันในการใช้ "ใหม่" และฉันอาจทำเช่นนั้นได้ แต่มันรู้สึกผิดและทำลายความแตกต่างซึ่งเป็นประเด็นทั้งหมด ดูเหมือนจะไม่ใช่ความคิดที่ดี ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
ตัวเลือก 3
ฉันสามารถใช้เขตข้อมูลที่มีการป้องกันและตั้งค่าในตัวสร้าง ดูเหมือนว่าค่อนข้างจะเป็นระเบียบ แต่ขึ้นอยู่กับฉันที่จะตรวจสอบให้แน่ใจว่า Constructor ตั้งค่านี้เสมอและมี Constructor ที่มีการโอเวอร์โหลดจำนวนมากซึ่งมีโอกาสที่เส้นทางของโค้ดบางอันจะไม่ตั้งค่า
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
มันเป็นคำถามเชิงทฤษฎีและฉันเดาว่าคำตอบต้องเป็นตัวเลือกที่ 1 เนื่องจากเป็นตัวเลือกที่ปลอดภัยเพียงอย่างเดียวแต่ฉันเพิ่งจะได้สัมผัสกับ C # และต้องการถามผู้คนที่มีประสบการณ์มากกว่านี้