Covariance in C# generic class

后端 未结 2 1451
执笔经年
执笔经年 2021-01-21 05:28

C# 4.0 .NET 4.5 Silverlight 5 It seems weird that I cant find the solution so need some help please.

I have base class Base and derived class Child : Base. I have also h

相关标签:
2条回答
  • 2021-01-21 06:08

    I think this is what you're after:

    public class Base<T> where T : EntityObject
    {
        protected Helper<T> helper;
    }
    public class Child : Base<MyEntity>
    {
        public Child()
        {
            helper = new Helper<MyEntity>();
        }
    }
    

    Edit (in response to your edit): You can add a Base, use like so:

    public class Base
    {
        // put anything here that doesn't rely on the type of T
        // if you need things here that would rely on T, use EntityObject and have 
        // your subclasses provide new implementations using the more specific type
    }
    public class Base<T> : Base where T : EntityObject
    {
        protected Helper<T> helper;
    }
    public class Child : Base<MyEntity>
    {
        public Child()
        {
            helper = new Helper<MyEntity>();
        }
    }
    public class User
    {
        private Base myBase;
        public User(TypeEnum t)
        {
            if(t == TypeEnum.MyEntity) myBase = new Child();
            ...
    
    0 讨论(0)
  • 2021-01-21 06:26

    If Foo : Bar, that doesn't mean that Some<Foo> : Some<Bar>. There are two ways of doing what you want. The first is to make the base-type generic such that:

    Base<T> where T : EntityObject {
        protected Helper<T> helper;
    }
    Child : Base<MyEntity> {...}
    

    The second is to use a non-generic interface at the base-type, i.e. have

    Base {
        protected IHelper helper;
    }
    Child : Base {...}
    

    where in the latter case, Helper<T> : IHelper, for some non-generic IHelper to-be-defined.

    As a side-note, you might find it easier to pass the value down in the constructor rather than using a protected field.

    0 讨论(0)
提交回复
热议问题