2017-10-20 30 views
5

Tôi có hai giao diện được thực hiện bởi một lớp chính. Làm thế nào tôi có thể refactor mã của tôi theo cách mà trên thực hiện mỗi hợp đồng, các phương pháp của mỗi hợp đồng có một giá trị khác nhau cho một tham số như DatabaseName.Giá trị tài sản khác nhau cho các hợp đồng

Ví dụ:

  1. Class1 Dụng cụ Interface1, Interface2
  2. Interface1.GetData() có DatabaseName thiết lập để Cơ sở dữ liệu 1
  3. Interface2.GetData() có DatabaseName thiết lập để cơ sở dữ liệu 2

Tôi có thể cấu hình các giá trị đó trong phương thức GetData() nhưng tôi muốn có cách làm sạch hơn.

Bất kỳ đề xuất mẫu nào là DI, Domain driven, thậm chí là ví dụ thừa kế cơ bản hoàn thành ở trên là những gì tôi đang tìm kiếm.

Trả lời

7

Có vẻ như tất cả các bạn cần là explicit interface implementation:

public class Class1 : Interface1, Interface2 
{ 
    // Note the lack of access modifier here. That's important! 
    Data Interface1.GetData() 
    { 
     // Implementation for Interface1 
    } 

    Data Interface2.GetData() 
    { 
     // Implementation for Interface2 
    } 
} 

Rõ ràng là hai phương pháp có thể gọi một phương pháp phổ biến với một tham số để chỉ định tên cơ sở dữ liệu hoặc tương đương.

+0

Tâm trí của tôi chỉ là thổi mà Jon skeet thậm chí trả lời câu hỏi newbie, nếu tôi có 100 phương pháp trong cả hai giao diện? –

+0

@ZohaibAmin: Sau đó, tôi sẽ khá lo lắng về những giao diện quá lớn để bắt đầu. Bạn chỉ cần sử dụng triển khai rõ ràng cho các phương thức mà bạn muốn triển khai khác nhau mặc dù - bạn có thể kết hợp triển khai giao diện ngầm định và rõ ràng. –

0

Tái cấu trúc thường được thúc đẩy bằng cách nhận thấy một mã nguồn và thực tế là bạn đã kết thúc trong một tình huống mà bạn phải triển khai 2 trừu tượng cho thấy chức năng tương tự là mã số. Nếu không có sự hiểu biết nhiều hơn về vấn đề tôi có thể không có khả năng cung cấp cho bạn một câu trả lời kết luận nhưng với sự hiểu biết hạn chế đây là những gì tôi sẽ đề xuất. Có 2 cách triển khai cụ thể khác nhau mỗi khi triển khai một giao diện và có một nhà máy sẽ được bơm cho khách hàng và làm cho khách hàng đưa ra quyết định có chủ ý cần thực hiện một trong những việc này. Trong trường hợp các lớp cụ thể này chia sẻ chức năng chung, bạn luôn có thể trừu tượng hóa nó thành một lớp cha mẹ chung.

public interface ISQLReader 
    { 
     string GetData(); 
    } 

    public interface IOracleReader 
    { 
     string GetData(); 
    } 

    public abstract class Reader 
    { 
     protected void CommonFunctionaility() 
     { 

     } 
    } 
    public class MSSQLReader : Reader, ISQLReader 
    { 
     public string GetData() 
     { 
      return "MSSQL"; 
     } 
    } 

    public class OracleReader : Reader, IOracleReader 
    { 
     public string GetData() 
     { 
      return "Oracle"; 
     } 
    } 

    public interface IReaderFactory 
    { 
     OracleReader CreateOracleReader(); 
     MSSQLReader CreateMSSQLReader(); 
    } 

    public class ReaderFactory : IReaderFactory 
    { 
     public MSSQLReader CreateMSSQLReader() => new MSSQLReader(); 

     public OracleReader CreateOracleReader() => new OracleReader(); 
    } 

    public class ReaderClient 
    { 
     private IReaderFactory _factory; 
     public ReaderClient(IReaderFactory factory) 
     { 
      this._factory = factory; 
     } 
    } 

Triển khai giao diện rõ ràng là kỹ thuật hạn chế việc sử dụng chức năng cho đến khi khách hàng đưa ra quyết định có chủ ý.

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