Tôi đã có một cuộc thảo luận với một đồng nghiệp, và cuối cùng chúng tôi đã có những trực giác mâu thuẫn về mục đích của việc phân lớp. Trực giác của tôi là nếu một chức năng chính của một lớp con là thể hiện một phạm vi giới hạn các giá trị có thể có của cha mẹ thì có lẽ nó không nên là một lớp con. Ông lập luận cho trực giác ngược lại: phân lớp đó thể hiện một đối tượng là "cụ thể" hơn, và do đó, mối quan hệ của lớp con là phù hợp hơn.
Nói một cách cụ thể hơn, tôi nghĩ rằng nếu tôi có một lớp con mở rộng một lớp cha nhưng mã duy nhất mà lớp con ghi đè là một hàm tạo (vâng, tôi biết các hàm tạo thường không "ghi đè", chịu đựng với tôi), sau đó những gì thực sự cần thiết là một phương pháp trợ giúp.
Ví dụ, hãy xem xét lớp học có phần thực tế này:
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;
}
}
Yêu cầu của ông là nó sẽ hoàn toàn thích hợp để có một lớp con như thế này:
public class SystemDataHelperBuilder
{
public SystemDataHelperBuilder()
: base(Configuration.GetSystemDatabaseEngine(),
Configuration.GetSystemConnectionString())
{
}
}
Vì vậy, câu hỏi:
- Trong số những người nói về các mẫu thiết kế, những trực giác nào là chính xác? Là phân lớp như mô tả ở trên một mô hình chống?
- Nếu nó là một mô hình chống, tên của nó là gì?
Tôi xin lỗi nếu điều này hóa ra là một câu trả lời dễ hiểu; các tìm kiếm của tôi trên google chủ yếu trả về thông tin về mô hình chống xây dựng kính viễn vọng và không thực sự là thứ tôi đang tìm kiếm.