2010-11-19 5 views
5

Có một vấn đề thiết kế như thế này.Thiết kế tốt nhất mà tôi có thể sử dụng để xác định các phương thức có cùng tên là gì?

Giả sử bạn có một nhóm lớp thực hiện các phương thức tương tự nhưng không thực hiện các phương thức tương tự.

Ví dụ: ClassA có các phương pháp như thế này.

void Add(string str); 
void Delete(string str); 
List<string> GetInfo(string name); 

Lớp khác, ClassB có các phương pháp sau.

void Add(Dictionary Info); 
void Delete(string str); 
Dictionary GetInfo(string name); 

Vì vậy, bản chất của các phương pháp tương tự nhưng các kiểu trả về/thông số đầu vào khác nhau. Nếu tôi phát triển một giao diện để duy trì tính nhất quán, tôi chỉ có thể xác định thao tác Xóa ở đó. Ngoài ra tôi có thể suy nghĩ về một tập hợp các lớp độc lập mà không có bất kỳ mối quan hệ với nhau (Tất nhiên không có triển khai giao diện) nhưng tôi không nghĩ rằng đó là một thiết kế tốt.

  1. Cách tiếp cận nào tôi có thể sử dụng để thực hiện việc này?
  2. Tôi mới sử dụng giao diện chung. Nó có giúp ích gì trong trường hợp này không? Nếu vậy tôi sẽ học và thực hiện bằng cách sử dụng chúng.
+1

Trong mối quan hệ nào (theo chương trình và khái niệm) các lớp A và B đứng? –

+0

Họ đang thực hiện các hoạt động trên các đối tượng tương tự. Trong quan điểm sharepoint bạn có thể nghĩ nó như SPList và SPWeb. Cả hai đều đại diện cho các mục nội dung, có hoạt động gần như giống nhau nhưng đầu vào/đầu ra có thể khác nhau. Vì vậy, chúng tôi cần một cách tốt để xác định "cấu trúc" nhưng chúng tôi vẫn không thể làm điều đó vì sự khác biệt loại tham số. –

Trả lời

8

Bạn có thể sử dụng giao diện chung ở đây. Một ví dụ:

interface IModifiable<T> 
{ 
    void Add(T Info); 
    void Delete(T item); 
    T GetInfo(string name); 
} 
public class MyClass : IModifiable<List<string>> 
{ 
    public void Add(List<string> list) 
    { 
     //do something 
    } 

    public void Delete(List<string> item) { } 
    public List<string> GetInfo(string name) { } 
} 
0

Tôi không thấy sự cố với các giao diện đó. Nhưng tôi DO thấy một vấn đề nếu bạn thực hiện cả hai giao diện trong cùng một lớp. Bạn sẽ phá vỡ Nguyên tắc chịu trách nhiệm duy nhất bằng cách làm như vậy.

đọc thêm ở đây: http://www.objectmentor.com/resources/articles/srp.pdf

Bạn cũng có thể đọc cuốn sách tuyệt vời này về một số nguyên tắc thiết kế: http://cdn.cloudfiles.mosso.com/c82752/pablos_solid_ebook.pdf

1
public interface IInt<T> { 
    void Add(T val); 
    void Delete(string str); 
    T GetInfo(string name); 
} 
3

Generics sẽ giúp bạn nếu bạn có thể thay đổi thiết kế của bạn một chút:

interface IFoo<TKey, TValue> 
{ 
    void Add(TKey name, TValue value); 
    void Delete(TKey name); 
    IEnumerable<TValue> GetInfo(TKey name); 
} 

này không hoàn toàn phù hợp với ví dụ của bạn, nhưng rất gần. Nếu bạn không thể thực hiện thay đổi này thì tôi muốn nói rằng các lớp của bạn không đủ tương tự để có một giao diện chung.

Bạn cũng nên lưu ý rằng thiết kế này rất giống với giao diện IDictonary hoặc ILookup. Có lẽ bạn có thể sử dụng các giao diện hiện có thay vì tạo một giao diện mới.

0

Vấn đề là khá vaugely định nghĩa nhưng từ những gì tôi hiểu Bạn có một vài khả năng đầu tiên sử dụng định nghĩa Generic Phương pháp

public void Detele<T>(T toDelete); //optional : where T 

và định nghĩa nó trong giao diện chung (hoặc lớp trừu tượng nếu trường hợp it'syour)

Nếu không, kỹ thuật âm thanh rất cũ nhưng vẫn là phương pháp quá tải. Bạn có thể định nghĩa nhiều phương thức có cùng tên nhưng lấy các đối số khác nhau. .Net sử dụng mô hình này rất nhiều các lớp như StreamReader, ToString vv

Từ chữ ký Bạn đã cung cấp nó giống như Bạn có thể tìm thấy cách sử dụng cho điều đó.

Tùy chọn thứ ba (mặc dù khó mã hơn) là sử dụng biểu thức lambda.

Add<T,P>(Action<T,P> addingAction, T source, P param) (addingAction(source,param);); 
//this is naive p.Add(q) it can be arbitralily more complicated 
aObject.Add((p,q) => p.Add(q), myObj, myParam); 

Bằng cách này, bạn xác định hành động chung để thêm có thể được đóng gói trong đối tượng của bạn. Chữ ký tôi đã cung cấp có thể dễ dàng thay đổi. Ngoài ra, bạn có thể không muốn thực hiện hành động ngay lập tức, nhưng lên lịch cho hành động lười biếng hoặc thực thi nó không đồng bộ. Các khả năng với các biểu thức lambda là Endless.

Ngoài ra, tôi đã cung cấp triển khai sử dụng Ủy quyền tác vụ. Bạn có thể dễ dàng chuyển đổi mã này để sử dụng lớp Expression, mà bạn có thể xây dựng các đại biểu của riêng bạn trong quá trình thực thi mã (và lưu trữ chúng sau khi khởi tạo vì nó là một quá trình phản chiếu và các công cụ khá chậm). khi có thể.

Chăm sóc Łukasz