C# 我可以用什么样的设计来定义同名的方法?
有这样一个设计问题 假设您有一组实现类似方法但不实现相同方法的类 示例:ClassA有这样的方法C# 我可以用什么样的设计来定义同名的方法?,c#,.net,oop,design-patterns,interface,C#,.net,Oop,Design Patterns,Interface,有这样一个设计问题 假设您有一组实现类似方法但不实现相同方法的类 示例:ClassA有这样的方法 void Add(string str); void Delete(string str); List<string> GetInfo(string name); 因此,这些方法的性质相似,但返回类型/输入参数不同。如果我开发一个接口来保持一致性,我只能在那里定义删除操作。或者,我可以考虑一组相互之间没有任何关系的独立类(当然没有接口实现),但我认为这不是一个好的设计 我可以使用什么方
void Add(string str);
void Delete(string str);
List<string> GetInfo(string name);
因此,这些方法的性质相似,但返回类型/输入参数不同。如果我开发一个接口来保持一致性,我只能在那里定义删除操作。或者,我可以考虑一组相互之间没有任何关系的独立类(当然没有接口实现),但我认为这不是一个好的设计
我认为这些接口没有问题。但是如果在同一个类中实现这两个接口,我确实看到了一个问题。这样做会打破单一责任原则 请在此处阅读更多信息: 您还可以阅读这本关于一些设计原则的优秀书籍:
公共接口IInt{
无效添加(T val);
无效删除(字符串str);
T GetInfo(字符串名称);
}
您可以在此处使用通用接口。例如:
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) { }
}
接口不可修改
{
无效添加(T信息);
作废删除(T项);
T GetInfo(字符串名称);
}
公共类MyClass:不可修改
{
公共作废添加(列表)
{
//做点什么
}
公共作废删除(列表项){}
公共列表GetInfo(字符串名称){}
}
如果您可以稍微更改设计,则泛型将对您有所帮助:
interface IFoo<TKey, TValue>
{
void Add(TKey name, TValue value);
void Delete(TKey name);
IEnumerable<TValue> GetInfo(TKey name);
}
接口IFoo
{
无效添加(TKey名称、TValue值);
作废删除(TKey名称);
IEnumerable GetInfo(TKey名称);
}
这不太适合你的例子,但非常接近。如果您不能进行此更改,那么我会说您的类没有足够的相似性,它们没有共同的接口
您还应该注意,此设计与IDictonary或ILookup接口非常相似。也许您可以使用现有接口,而不是创建新的接口。这个问题的定义很难说,但据我所知,您有几种可能性 首先使用泛型方法定义
public void Detele<T>(T toDelete); //optional : where T
public void Detele(T todelet)//可选:其中T
并在通用接口(或抽象类,如果是您的情况)中定义它
否则,一种非常古老但仍然有效的技术就是方法重载。您可以使用相同的名称定义多个方法,但使用不同的参数。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);
Add(Action addingAction,T source,P param)(addingAction(source,param););
//这是幼稚的p.Add(q)它可能更复杂
aObject.Add((p,q)=>p.Add(q),myObj,myParam);
通过这种方式,您可以定义添加的一般操作,然后可以将其封装到对象中。我提供的签名很容易修改。此外,您可能不希望立即执行该操作,而是将其安排为延迟执行,或者异步执行。lambda表达式的可能性是无穷的
我还提供了一个使用ActionDelegate的实现。您可以轻松地将此代码转换为使用Expression类,通过该类,您可以在代码执行期间构建自己的委托(并在初始化后缓存它们,因为这是一个相当缓慢的过程,即反射等)。我强烈建议尽可能滥用委托和表达式
保重
Łukasz类A和类B的关系(编程和概念上)是什么?它们在类似的对象上执行操作。在sharepoint透视图中,您可以将其视为SPList和SPWeb。它们都表示内容项,具有几乎相同的操作,但输入/输出可能不同。因此,我们需要一种很好的方法来定义“结构”,但由于参数类型的差异,我们仍然无法这样做。
public void Detele<T>(T toDelete); //optional : where T
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);