【问题标题】:How to implement polymorphic interface with generic custom collection如何使用通用自定义集合实现多态接口
【发布时间】:2011-08-31 05:57:42
【问题描述】:

好的 - 所以我想要完成的是:使用接受三种自定义类型之一的泛型集合构建一个 poly 接口(通过接口约束)。

问题出在我为

编写实现时
public virtual CustCollection<CustType1> GetEntities()
{
    return new CustCollection<CustType1>();
}

然后尝试在下一个衍生级别覆盖它。我什至无法选择覆盖此实现。

另一种可能性是使用接口,但我需要接口接受泛型,而不是指定类型...我似乎无法正常工作

即我需要的是:

interface IAccess<T>
{
    CustCollection<T> GetEntities();
}

但这似乎不是一个选项......

有什么建议吗?

【问题讨论】:

    标签: c# collections interface generics


    【解决方案1】:

    我没听错吗? :)

    public interface IUnknown { }
    
    public class SoAndSo : IUnknown { }
    
    public class CustomCollection<IUnknown>
    {
    }
    
    public class Ancestor<T> where T : IUnknown
    {
        public virtual CustomCollection<T> GetEntities()
        {
            return null;
        }
    }
    
    public class Descender : Ancestor<SoAndSo>
    {
        public override CustomCollection<SoAndSo> GetEntities()
        {
            return base.GetEntities();
        }
    }
    

    【讨论】:

    • 我最终取消了对集合的约束,创建了一个新接口并像之前对集合所做的那样约束了这个接口。然后任何对象(我的集合接口对象)都实现了 IAccess 接口,并指定了对象类型。
    • 如果我能记得明天再跳到这里,我将用伪代码示例发布我的完整答案(目前仍然是新手太多,现在无法回答......必须等待 8 小时)。
    【解决方案2】:

    我最终创建了一个接口(如上所示的 IAccess)并将类型约束放在该接口上...然后在与相关类型交互的所有类上使用该接口。

    所以(对不起,这是高级别的,我无法写出我的实际实现)

    interface IAccess<T> where T : ITypeInterface
    {
        CustCollection<T> GetEntities(Filter filter);
    }
    

    我尝试了建议的方法,但我有 3 个继承类的链,并且使用建议的模型与最顶层的父级存在问题。

    我在自定义集合上留下了约束:

     public class CustCollection<T> : IEnumerable<T> where T : ITypeInterface
        {}
    

    这只对我真的有用,因为我意识到我真的不需要与父类共享功能(所以基本上没有最终强制执行真正的多态性......仅在通用对象交互的意义上,核心功能完全是分开)。

    为了避免阴影,我声明了新的

      public new CustCollection<Type> GetEntities(Filter filter)
        {
            return new CustCollection<Type>();
        }
    

    我希望这对某些人有所帮助...虽然我并没有完全实现我一开始就打算做的事情,但我发现这是一个适合我情况的解决方法。

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 2023-01-18
      • 2017-07-09
      • 1970-01-01
      • 2010-10-10
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多