Xin lỗi nếu điều này nghe có vẻ đơn giản, nhưng tôi đang tìm kiếm một số giúp đỡ để cải thiện mã của tôi :)Refactoring lớp trừu tượng trong C#
Vì vậy, tôi đang có việc thực hiện sau (mà tôi cũng viết):
public interface IOptimizer
{
void Optimize();
string OptimizerName { get; }
}
public abstract AbstractOptimizer : IOptimizer
{
public void Optimize()
{
// General implementation here with few calls to abstract methods
}
}
public abstract AbstractPriorityOptimizer : AbstractOptimizer
{
// Optimize according to priority criteria.
string Name
{
get { return "Priority Optimizer"; }
}
}
Sau đó, tôi có các lớp bê tông công nghệ cụ thể:
TechnologyXPriorityOptimizer : AbstractPriorityOptimizer
TechnologyYPriorityOptimizer : AbstractPriorityOptimizer
Bây giờ tôi đang cố gắng để thêm một ưu generic, một tối ưu hóa cho điều kiện khác hơn là ưu tiên hàng đầu, vì vậy cố gắng của tôi:
public abstract AbstractGenericOptimizer : AbstractOptimizer
{
// Optimize according to a generic criteria.
private readonly int param;
public AbstractGenericOptimizer (int param) : base()
{
// param affects the optimization
this.param = param;
}
}
và tôi cũng cần phải thực hiện công nghệ cụ thể giống như tôi ưu hoa ưu tiên:
TechnologyXGenericOptimizer : AbstractGenericOptimizer
TechnologyYGenericOptimizer : AbstractGenericOptimizer
Q1. TechnologyXPriorityOptimizer
và TechnologyXGenericOptimizer
có cùng phương pháp "bổ sung" chính xác vì chúng liên quan đến cùng một công nghệ. Có cách nào để giữ phương pháp này phổ biến cho cả hai nhánh thừa kế?
Q2. Đối với AbstractGenericOptimizer
, trình tối ưu hóa có tên đặc biệt cho các giá trị đặc biệt của int param
, do đó, nên mở rộng lớp tối ưu hóa chung cơ sở (trong đó param được mã hóa cứng) và sau đó cho mỗi bộ phận, có triển khai công nghệ cụ thể:
AbstractSpecialName1Optimizer: AbstractGenericOptimizer
TechnologyXSpecialName1Optimizer: AbstractSpecialName1Optimizer
TechnologyYSpecialName1Optimizer: AbstractSpecialName1Optimizer
AbstractSpecialName2Optimizer: AbstractGenericOptimizer
....
Cách tốt nhất để cấu trúc lại kịch bản này là gì? Tôi cảm thấy rằng có một cách thông minh hơn để giảm số lượng các mức thừa kế.
Cảm ơn!
Cảm ơn đề xuất của bạn. Trong trường hợp này, tôi có triển khai Optimize() trong lớp OptimizerStrategy không? Tôi nên làm gì với IOptimizer? – alhazen
Tôi không có ý tưởng; nó phụ thuộc vào mã thực sự làm gì. Tuy nhiên, có lẽ cả hai. – SLaks