所以这是代码:
interface A<T>
{
T Save();
}
interface B : A<B>
{
}
class BusinessBase<T>
{
T Save();
}
class D<T, U> : BusinessBase<T>
where T : BusinessBase<T>
where U : B<U>
{
new U Save()
{
base.Save(); // this is where the error is because T can't be converted to U
}
}
class Concrete : D<Concrete , B>, B
{
}
所以我希望拥有的是一个定义A的所有方法的基类,它们实际上只是重定向到C中的方法。但是为了支持IoC和CSLA,它必须是这样的。所以我要找的是让D中的保存返回U而不是T以匹配接口签名..
我一直在盯着这一段时间,似乎无法弄清楚我错过了什么。
答案 0 :(得分:1)
我认为你需要:
class BusinessBase<T> : B
{
T Save();
}
和
class D<T, U> : BusinessBase<T>
where T : BusinessBase<T>
where U : B<U>
{
new U Save()
{
return base.Save();
}
}
我认为错误是因为您在BusinessBase<T>.Save()
和您尝试返回的B<U>
之间没有任何隐式或显式连接。这可能会破坏其他接口吗?
您是否查看了涵盖CSLA框架的Expert C#2008 Business Objects?
答案 1 :(得分:1)
好的,我只是想为我的例子中的一些不良代码道歉。但希望如果你看了一会儿就可以看出它出了问题。但这是我提出的答案。我认为在转换中可能有更好的方法,但我想要一个不需要我更改BusinessBase类的解决方案,因为它是一个核心的CSLA组件,而不是我想要改变的组件。以下是我提出的代码:
interface A<T>
{
T Save();
}
interface IConcreteInterface : A<IConcreteInterface>
{
}
class BusinessBase<T>
where T : BusinessBase<T>
{
public T Save()
{
return (T)this;
}
}
class D<T, U> : BusinessBase<T>
where T : BusinessBase<T>, A<U>
where U : A<U>
{
public new U Save()
{
return (U)(object)base.Save();
}
}
class ConcreteClass : D<ConcreteClass, IConcreteInterface>, IConcreteInterface
{
}
使其发挥作用的变化是: return(U)(object)base.Save();
之前我没有在样本中加入(U),因为它没有像那样编译。由于T和U之间没有可以确定的关系。因此,解决这个问题的唯一方法是将返回T从Save转换为(object),然后当然可以将其转换为任何内容。
您注意到我还添加了一个类型约束,以防止出现错误,因为我确保T是A类型而U是A类型。这可以确保两种类型都具有相同的接口。
如果某人有更漂亮的东西,我愿意接受建议。但是现在这是有效的,我觉得它有点好。 你可以做我所做的事情,至少需要T来实现它不漂亮你可以强制执行一点