支持IoC的基类方法的接口声明

时间:2010-06-30 00:26:59

标签: c# .net design-patterns interface csla

所以这是代码:

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以匹配接口签名..

我一直在盯着这一段时间,似乎无法弄清楚我错过了什么。

2 个答案:

答案 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来实现它不漂亮你可以强制执行一点