代码之家  ›  专栏  ›  技术社区  ›  spinon

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

  •  2
  • spinon  · 技术社区  · 14 年前

    代码如下:

    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中的方法。但要支持国际奥委会和CSLA就必须这样。所以我要找的是让save in D return U T与接口签名匹配。。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Joseph Yaduvanshi    14 年前

    我想你需要:

    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业务对象?

        2
  •  1
  •   spinon    14 年前

    好吧,我只想为我的示例中的一些错误代码道歉。但如果你看一段时间,你会发现哪里出了问题。但这是我想到的答案。我认为在转换中可能有更好的方法,但是我想要一个不需要我更改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();

    您注意到,我还添加了一个类型约束,以稍微增加对强制转换错误的保护,因为我要确保T是类型a,U是类型a。这样可以确保两种类型具有相同的接口。

    如果有人有更漂亮的东西,我愿意接受建议。但现在这是工作,我觉得有点好。