1

我一直在寻找为什么这个通用构造不能编译

我得到:
无法将类型“WpfApplication1.CowDao”隐式转换为“WpfApplication1.Dao”

public abstract class Animal { }

public class Dog : Animal { }

public class Cow : Animal { }

public abstract class Dao<T> where T : Animal 
{
    public void Insert(T t);
}

public class DogDao : Dao<Dog> { }

public class CowDao : Dao<Cow> { }

public class Main
{
    public Main()
    { 
        Dao<Animal> dao = null;

        if (true) dao = new DogDao();
        else dao = new CowDao();
    }
}

我只是想达到我的目标->制作一个“中立”实例
我认为我的结构必须改变,但我不知道如何

我正在使用 .NET Framework 4

谢谢

4

2 回答 2

0

将 Dao 层的继承更改为

public class DogDao : Dao<Animal> { }

public class CowDao : Dao<Animal> { }

编辑:

 public abstract class Dao<T> where T : Animal
    {
        public virtual void Insert(T t)
        {

        }

        protected void ExecuteQuery(string quer)
        {

        }
    }

    public class DogDao : Dao<Dog>
    {
        public override void Insert(Dog t)
        {
            string insert = "INSERT INTO DOG ...";

            base.ExecuteQuery(insert);
        }
    }

    public class CowDao : Dao<Cow>
    {
        public override void Insert(Cow t)
        {
            string insert = "INSERT INTO COW ...";

            base.ExecuteQuery(insert);
        }

    }
于 2013-03-01T09:29:34.883 回答
0

派生的泛型不会从基类的泛型继承,因此您不能将一个转换为另一个。相反,编写一个扩展方法 ToGenericParent 像这样转换:

public static Generic<Parent> ToGenericParent(this Generic<Derived> derived)
        {
            return new Generic<Parent>() { Value = derived.Value };
        }
于 2013-03-01T09:41:57.087 回答