采用任何属性类/模型C#的接口方法

时间:2018-08-28 18:42:28

标签: c#

因此,我想创建一个接口,该接口的方法可以用于任何模型类。例如

我有这三个属性类

class A
{
    public long id { get; set; }
    public string description { get; set; }
    public string code { get; set; }
}

class B
{
    public long someID { get; set; }
}

class C
{
    public long anydesign { get; set; }
}

class D
{
    public long Router { get; set; }
}

我有一个界面

public interface IModel
{
    void Dosomething(A model); // Now in this example it takes the A model,But I want it to be set, so that that class that implements the interface can put any model as required
}

现在,我有一个实现该模式的类,因为该接口仅采用A模型,所以我可以在实现过程中将A模型传递给该类

public class ImplemenationA: IModel
{
    public void Dosomething(A model)
    {
        Console.WriteLine(model.description);
    }
}

说我有另一个实现类,现在我猜下面的方法是行不通的,因为接口签名仅强制采用模型A而没有其他模型

public class ImplementationB:IModel
{
   public void Dosomething(B model)
   {
        Console.WriteLine(model.someID);
   }
}

我希望任何实现类都可以调用接口方法并使用任何模型

2 个答案:

答案 0 :(得分:9)

根据您的描述,您可能需要使用泛型。由于您要创建单独的实现,因此可以应用下面的接口来获得相似的结果。

public interface IModel<T>
{
   void Dosomething(T model);
}

public class ImplementationB : IModel<B>
{
   public void Dosomething(B model)
    {
      Console.WriteLine(model.someID);
    }
}

答案 1 :(得分:0)

某种Decorator模式可以解决此问题,将您的实际实现推迟到内部类上并坚持分离关注点,如果我想不通您的问题,请发表评论:

//added to support inner implementation 
interface IModelImpl {
 void Do();
}

class A: IModelImpl
{
    public long id { get; set; }
    public string description { get; set; }
    public string code { get; set; }

    public void Do(){
        console.WriteLine(this.description);
    }
}

class B: IModelImpl
{
    public long someID { get; set; }
    public void Do(){
        console.WriteLine(this.someID);
    }
}

class C: IModelImpl
{
    public long anydesign { get; set; }
    public void Do(){
        ...
    }
}

这是您的IModel,几乎一样,被视为外部实现:

public interface IModel
{
    void Dosomething(IModelImpl model); //put any model as long it implements IModelImpl 
}

您的类实现现在应更改为:

public class ImplemenationA: IModel
{
    public void Dosomething(IModelImpl model)
    {
       //Do more specific work to ImplementationA 
       model.Do();
    }
}

另一个类实现:

public class ImplementationB:IModel
{
   public void Dosomething(IModelImpl model)
   {
       //Do more specific work to ImplementationB like validation
       model.Do();
   }
}