因此,我想创建一个接口,该接口的方法可以用于任何模型类。例如
我有这三个属性类
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);
}
}
我希望任何实现类都可以调用接口方法并使用任何模型
答案 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();
}
}