2010-11-19 25 views
5

有这样的设计问题。什么是我可以用来定义具有相同名称的方法的最佳设计?

假设您有一组实现类似方法但不相同的方法。

示例:ClassA具有类似这样的方法。

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

另一个类,ClassB有以下方法。

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

所以方法的性质是相似的,但返回类型/输入参数是不同的。如果我开发一个接口来保持一致性,那么我只能在那里定义Delete操作。或者,我可以考虑一组独立类,彼此之间没有任何关系(当然没有接口实现),但我不认为这是一个好设计。

  1. 我可以用什么方法来实现这个?
  2. 我是新来的通用接口。在这种情况下有帮助吗?如果是的话,我将学习和实施使用它们。
+1

在什么关系(编程和概念上)做的类A和B站? – 2010-11-19 09:50:47

+0

他们正在对类似对象执行操作。在分享观点中,您可以将其视为SPList和SPWeb。它们都代表内容项目,具有几乎相同的操作,但输入/输出可能不同。所以我们需要一种很好的方法来定义“结构”,但由于参数类型的差异,我们仍然无法做到。 – 2010-11-19 09:54:51

回答

8

你可以在这里使用的通用接口。举个例子:

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) { } 
} 
1
public interface IInt<T> { 
    void Add(T val); 
    void Delete(string str); 
    T GetInfo(string name); 
} 
3

泛型会帮助你,如果你可以稍微改变设计:

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

这并不完全适合您的例子,但非常接近。如果你不能做这个改变,那么我会说你的类不够类似,它们有一个共同的接口是有意义的。

您还应该注意,这个设计非常类似于IDictonary或ILookup接口。也许你可以使用现有的接口,而不是创建一个新接口。

0

的问题是相当vaugely定义,但是从我了解您有几种可能性 第一次使用泛型方法定义

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

和通用接口定义它(或抽象类是否it'syour情况下)

否则,一个非常古老但仍然健全的技术是方法重载。您可以定义多个具有相同名称但采用不同参数的方法。 。Net使用这种模式,比如StreamReader,ToString等

从签名你提供它看起来像你可能会找到一个用途。

第三种选择(尽管编码更困难)是使用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); 

这种方式您可以定义一个通用的添加操作,然后将其封装在您的对象中。我提供的签名可以很容易地改变。此外,您可能不希望立即执行该操作,而是将其安排为执行延迟,或者以异步方式执行。 lambda表达式的可能性是无尽的。

另外我提供了一个使用Action委托的实现。您可以轻松地将此代码转换为使用Expression类,通过该类您可以在代码执行期间构建自己的委托(并在初始化后缓存它们,因为这是一个相当缓慢的过程,即反射和东西)。我强烈建议滥用委托和表达式如果可能。

以关心 卢卡斯

相关问题