2011-09-28 40 views
8

Tôi có một loạt các hệ thống, hãy gọi cho chúng A, B, C, D, E, F, G, H, I, J.Giao diện, Tóm tắt hoặc chỉ các phương pháp ảo?

Tất cả đều có các phương thức và thuộc tính tương tự. Một số chứa cùng một phương pháp và thuộc tính giống nhau, một số có thể thay đổi đôi chút và một số có thể thay đổi rất nhiều. Ngay bây giờ, tôi có rất nhiều mã trùng lặp cho mỗi hệ thống. Ví dụ, tôi có một phương pháp gọi là GetPropertyInformation() được định nghĩa cho mỗi hệ thống. Tôi cố gắng để tìm ra những phương pháp sẽ là phương pháp tốt nhất để giảm mã trùng lặp hoặc có lẽ một trong những phương thức dưới đây không phải là cách để đi:

Interface

public Interface ISystem 
{ 
    public void GetPropertyInformation(); 
    //Other methods to implement 
} 

public class A : ISystem 
{ 
    public void GetPropertyInformation() 
    { 
     //Code here 
    } 
} 

Tóm tắt

public abstract class System 
{ 
    public virtual void GetPropertyInformation() 
    { 
     //Standard Code here 
    } 
} 

public class B : System 
{ 
    public override void GetPropertyInformation() 
    { 
     //B specific code here 
    } 
} 

Phương pháp ảo trong lớp Super Base

public class System 
{ 
    public virtual void GetPropertyInformation() 
    { 
    //System Code 
    } 
} 

public class C : System 
{ 
    public override void GetPropertyInformation() 
    { 
     //C Code 
    } 
} 

Một câu hỏi, mặc dù nó có thể là ngu ngốc, giả sử tôi đã đi theo phương pháp trừu tượng và tôi muốn ghi đè lên GetPropertyInformation, nhưng tôi cần phải chuyển cho nó một tham số bổ sung, điều này có thể hay tôi sẽ phải tạo một phương thức khác trong lớp trừu tượng? Ví dụ: GetPropertyInformation(x)

Trả lời

6

Phương pháp tiếp cận trừu tượng và "siêu cơ sở" của bạn không quá khác nhau. Bạn nên luôn luôn làm cho lớp cơ sở trừu tượng, và bạn có thể cung cấp một thực hiện mặc định (các phương thức ảo) hay không (các phương thức trừu tượng). Yếu tố quyết định là liệu bạn có bao giờ muốn có trường hợp của lớp cơ sở, tôi nghĩ là không.

Vì vậy, nó nằm giữa lớp cơ sở và giao diện. Nếu có sự liên kết chặt chẽ giữa các lớp A, B C của bạn thì bạn có thể sử dụng một lớp cơ sở và có thể là một triển khai phổ biến.

Nếu các lớp A, B, C không tự nhiên thuộc về một 'gia đình' đơn lẻ, sau đó sử dụng giao diện.

System không phải là một cái tên hay.

Và bạn không thể thay đổi danh sách tham số khi ghi đè. Có thể các tham số mặc định có thể giúp, nếu không bạn chỉ cần 2 overloads cho GetPropertyInformation().

+0

Tôi có cảm giác về các lớp trừu tượng và siêu cơ bản giống nhau. Các hệ thống A, B, C có khớp nối mạnh. Có một tiêu chuẩn công nghiệp, nhưng nó không phải được theo sau, vì vậy mỗi người có thể áp dụng tiêu chuẩn hoặc thay đổi tiêu chuẩn cho phù hợp của họ. Trong sự vội vàng, tôi chọn System :) – Xaisoft

+0

Điểm tốt bằng cách này. – Xaisoft

3

Thông thường bạn chọn kế thừa đối tượng khi bạn muốn chia sẻ triển khai và giảm những gì nếu không sẽ được sao chép. Nếu không, các giao diện sẽ giành chiến thắng vì chúng linh hoạt hơn vì không cần lớp cơ sở chung.

Để ghi đè phương thức và sửa đổi danh sách tham số không thể thực hiện được. Hãy tưởng tượng làm thế nào bạn sẽ gọi phương thức đó trên một lớp cơ sở hoặc một tham chiếu giao diện?

+0

Đó là "có thể" - bạn sẽ có thể khai báo phương thức như vậy, nó không còn là cách ghi đè phương thức gốc nữa. – millimoose

+2

@Sii Chắc chắn là không thể. Câu hỏi được yêu cầu * ghi đè * phương thức và thêm tham số. Điều đó không thể được thực hiện. –

+0

Tôi có cảm giác nó không thể được thực hiện, mơ tưởng. – Xaisoft

3

Tôi muốn sử dụng thứ gì đó giống như những gì tôi đã thêm bên dưới. Bạn vẫn nhận được lợi ích của hợp đồng giao diện và triển khai được chia sẻ.

public Interface ISystem 
{ 
    public void GetPropertyInformation(); 
    //Other methods to implement 
} 

public abstract class System : ISystem 
{ 
    public virtual void GetPropertyInformation() 
    { 
     //Standard Code here 
    } 
} 

public class B : System 
{ 
    public string ExtendedSystemProp {get;set;} 

    public override void GetPropertyInformation() 
    { 
     base.GetPropertyInformation(); 

     var prop = "some extra calculating"; 

     GetExtraPropertyInformation(prop); 
    } 

    public void GetExtraPropertyInformation(string prop) 
    { 
     ExtendedSystemProp = prop; 
    } 
} 

ISystem genericSystem = new B(); 
genericSystem.GetPropertyInformation(); 

(genericSystem as B).ExtendedSystemProp = "value"; 
+0

Bạn có thể giải thích lý do tại sao bạn sẽ thực hiện phương pháp này không? – Xaisoft

+0

Bằng cách này, bạn vẫn nhận được tất cả các thuộc tính của bạn ngay cả khi bạn chỉ lập trình với giao diện 'ISystem' (mà bạn nên làm khi bạn có chúng). Tuy nhiên, nếu bạn đang mã hóa trong một bối cảnh mà chỉ tồn tại B: 'B bSystem = new B();' bạn cũng đưa ra phương thức 'B' cụ thể để sử dụng rõ ràng. – scottm

2

Bạn không thể chuyển thông số thừa vào quá trình ghi đè. Khi bạn ghi đè, bạn đang ghi đè phương thức bằng chữ ký chính xác. Tôi sẽ đề nghị bạn vượt qua trong một tham số giao diện như IPropertyInformation mà có thể thay đổi cho mỗi thực hiện.

Quyết định đi cùng với lớp cơ sở hoặc giao diện cho việc triển khai của bạn thực sự phụ thuộc vào việc bạn sử dụng. Do A-I có đủ điểm chung với nhau rằng chúng có thực sự bắt nguồn từ cùng một lớp cơ sở không? Nếu vậy, sau đó sử dụng một lớp cơ sở. Có thực sự là chỉ GetPropertyInformation được chia sẻ và nếu không thì các hệ thống hoàn toàn khác nhau về mặt chức năng? Sau đó, bạn thực sự chỉ muốn họ chia sẻ một giao diện.

2

Những người khác đã đề cập đến những gì ban đầu trong câu trả lời của tôi, nhưng về điểm "thêm một tham số": Đừng quên rằng C# mới nhất cũng cho phép bạn có các tham số tùy chọn trong phương thức.

+0

Nhưng tôi sẽ phải khai báo các tham số tùy chọn ngay từ đầu. Tôi có thể không biết rằng tôi cần một tham số cho đến khi 1 năm xuống đường, vì vậy các thông số tùy chọn làm tôi không tốt trong trường hợp đó. – Xaisoft

2

Trừ khi bạn có lý do thuyết phục khác, tôi sẽ đi với giao diện. Phương pháp ảo công khai, mặc dù được thực hiện rất nhiều, là not ideal.

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