Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以用什么样的设计来定义同名的方法?_C#_.net_Oop_Design Patterns_Interface - Fatal编程技术网

C# 我可以用什么样的设计来定义同名的方法?

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); 因此,这些方法的性质相似,但返回类型/输入参数不同。如果我开发一个接口来保持一致性,我只能在那里定义删除操作。或者,我可以考虑一组相互之间没有任何关系的独立类(当然没有接口实现),但我认为这不是一个好的设计 我可以使用什么方

有这样一个设计问题

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

示例:ClassA有这样的方法

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);