using System;
using System.Collections.Generic;
namespace mymodels
{
public abstract class mybase
{
public string v1 {get; set;}
}
public class derivedA : mybase
{
public string v2 {get; set;}
}
public class derivedB : mybase
{
public string v2 {get; set;}
}
}
namespace myservices
{
interface iBaseService<T> where T : mymodels.mybase
{
T Get ();
}
public class derviedAService : iBaseService<mymodels.derivedA>
{
public derviedAService (){}
public mymodels.derivedA Get()
{
mymodels.derivedA d = new mymodels.derivedA();
return d;
}
}
public class derviedBService : iBaseService<mymodels.derivedB>
{
public derviedBService (){}
public mymodels.derivedB Get()
{
mymodels.derivedB d = new mymodels.derivedB();
return d;
}
}
}
namespace m
{
public class user
{
myservices.iBaseService<mymodels.mybase> myservice = null;
public user()
{
bool mode1 = true;
if (mode1)
myservice = (myservices.iBaseService<mymodels.mybase>)new myservices.derviedAService();
else
myservice = (myservices.iBaseService<mymodels.mybase>)new myservices.derviedBService();
}
}
}
我正在尝试为使用抽象基类和派生类的服务创建一个通用接口。我从泛型接口创建了两个实现,每个实现对应一个派生类型。我有这样的设置,没有任何问题....
我的问题出现在我的用法类.....现在我尽量避免使用IOC(统一等等)。我想设置usage类来创建一个基服务类的实例,然后将实例类型强制转换为选定的派生服务实现…
我相信这可以用unity....完成我打算最终使用它…但现在我只想做一些简单的事情来启动和运行……我的代码编译,但在运行时,我得到一个错误在以下模式:
无法将类型'derviedAService '的对象强制转换为类型'iBaseService ' 1[mybase]'.
我已经尝试使用一个接口来代替抽象类,但这并没有解决问题。
你的接口不是协变的——当你声明它时,它需要显式地协变。所以这:
interface iBaseService<T> where T : mymodels.mybase
应:interface iBaseService<out T> where T : mymodels.mybase
…除了还应该遵循。net命名约定,使用PascalCase命名空间、类型和方法名。你的代码现在非常非常规