ฉันมีการพูดคุยกับเพื่อนร่วมงานและท้ายที่สุดเราก็มีสัญชาติญาณที่ขัดแย้งกันเกี่ยวกับวัตถุประสงค์ของการทำคลาสย่อย สัญชาตญาณของฉันคือถ้าฟังก์ชั่นหลักของคลาสย่อยแสดงค่าที่เป็นไปได้ที่ จำกัด ของพาเรนต์มันก็คงไม่ควรเป็นคลาสย่อย เขาแย้งกับสัญชาตญาณตรงข้ามว่าคลาสย่อยหมายถึงวัตถุที่เป็น "เฉพาะ" มากกว่าดังนั้นความสัมพันธ์คลาสย่อยจึงเหมาะสมกว่า
เพื่อให้สัญชาตญาณของฉันเป็นรูปธรรมมากขึ้นฉันคิดว่าถ้าฉันมี subclass ที่ขยายคลาสแม่ แต่รหัสเดียวที่แทนที่ subclass เป็นตัวสร้าง (ใช่ฉันรู้ว่าตัวสร้างไม่ได้โดยทั่วไป "แทนที่", ทนกับฉัน) แล้ว สิ่งที่จำเป็นจริงๆคือวิธีการช่วยเหลือ
ตัวอย่างเช่นลองพิจารณาชั้นเรียนชีวิตจริงนี้:
public class DataHelperBuilder
{
public string DatabaseEngine { get; set; }
public string ConnectionString { get; set; }
public DataHelperBuilder(string databaseEngine, string connectionString)
{
DatabaseEngine = databaseEngine;
ConnectionString = connectionString;
}
// Other optional "DataHelper" configuration settings omitted
public DataHelper CreateDataHelper()
{
Type dataHelperType = DatabaseEngineTypeHelper.GetType(DatabaseEngine);
DataHelper dh = (DataHelper)Activator.CreateInstance(dataHelperType);
dh.SetConnectionString(ConnectionString);
// Omitted some code that applies decorators to the returned object
// based on omitted configuration settings
return dh;
}
}
การอ้างสิทธิ์ของเขาคือมันจะเหมาะสมอย่างยิ่งที่จะมีคลาสย่อยเช่นนี้:
public class SystemDataHelperBuilder
{
public SystemDataHelperBuilder()
: base(Configuration.GetSystemDatabaseEngine(),
Configuration.GetSystemConnectionString())
{
}
}
ดังนั้นคำถาม:
- ในบรรดาคนที่พูดถึงรูปแบบการออกแบบสัญชาตญาณเหล่านี้ถูกต้องหรือไม่? การจัดคลาสย่อยตามที่อธิบายไว้ข้างต้นเป็นแบบป้องกันหรือไม่
- หากเป็นรูปแบบการต่อต้านชื่อของมันคืออะไร?
ฉันขอโทษถ้าสิ่งนี้กลายเป็นคำตอบที่ googleable ได้อย่างง่ายดาย การค้นหาของฉันบน google ส่วนใหญ่ส่งคืนข้อมูลเกี่ยวกับรูปแบบการต่อต้านการสร้างเหลื่อมและไม่ใช่สิ่งที่ฉันกำลังมองหา