2013-03-01 4 views
1

Я искал, почему это родовое не в строительстве компилироватьНаследование Generic инвариантность C# 4

я получаю:
Не удается неявно преобразовать тип «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 Рамочные 4

Благодаря

ответ

0

Изменения наследования для Dao слоев, как

public class DogDao : Dao<Animal> { } 

public class CowDao : Dao<Animal> { } 

Edit:

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); 
     } 

    } 
+0

Но тогда моя общая структура не полезны, и мне нужно это из-за специфических методов коровы и собаки – DarkShaDoWke

+0

Вы доу у собак и CowDaos, почему вам нужны конкретные методы в вашей базовой дао? Просто реализуйте их в своих конкретных daos – Dominik

+0

Из-за разного sql-запроса – DarkShaDoWke

0

Дженерик из производных не наследует Generic от базового класса, так что вы не могут отбрасывать друг друга. Вместо этого, написать метод расширения ToGenericParent, который преобразует так:

public static Generic<Parent> ToGenericParent(this Generic<Derived> derived) 
     { 
      return new Generic<Parent>() { Value = derived.Value }; 
     } 
+0

И как мне его реализовать? – DarkShaDoWke