2010-02-04 40 views
13

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. TechnologyXPriorityOptimizerTechnologyXGenericOptimizer 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!

Trả lời

8

Có lẽ bạn nên sử dụng ngăn chứa thay vì thừa kế. Ví dụ: bạn có thể tạo lớp trừu tượng OptimizerStrategy với triển khai cụ thể cho từng công nghệ, sau đó làm cho GenericOptimizerPriorityOptimizer lấy một tham số kiểu OptimizerStrategy làm tham số kiểu hoặc tham số hàm tạo chung.

+0

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

+0

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

3

Ad hoc I có xu hướng nói rằng bạn không thể có được thiết kế mong muốn của mình chỉ bằng cách sử dụng kế thừa. Bạn phải có đường dẫn thừa kế trực giao - ưu tiên và chung chung ở một bên và công nghệ X và Y ở bên kia. Bạn muốn kết hợp mã từ cả hai đường dẫn trong bốn kết hợp có thể nhưng điều này sẽ đòi hỏi nhiều thừa kế - kế thừa từ ưu tiên hoặc chung chung và công nghệ X hoặc Y. Vì C# không hỗ trợ đa thừa kế, điều này sẽ không hoạt động.

Tôi sẽ cố gắng giải quyết vấn đề này bằng cách sử dụng giao diện và strategy pattern. Điều này sẽ cho phép bạn trích xuất mã cụ thể cho tất cả bốn thành phần cốt lõi thành các lớp riêng biệt và sau đó hợp nhất luôn hai thành phần trong mỗi trong bốn kết hợp mong muốn.

+0

Cảm ơn bạn đã liên kết – alhazen

Các vấn đề liên quan