2010-10-05 19 views
0

想象一下,我有一個通用的基類是這樣的:如何在繼承樹中向下使用泛型基類?

public abstract class AnimalDTO<TA, TB> 
{ 
    public static TB ToDTO(TA entity) 
    { 
     return ConvertToDTO<TB>(entity); 
    } 
} 

類是負責能夠在傳入實體轉化爲DTO。

我有一個使用這個通用類,一類:

public class MammalDTO<Mammal, MammalDTO> 
{ 
    // omitted stuff here 
} 

用戶現在可以使用MammalDTO.ToDTO(mammal)Mammal轉換爲MammalDTO

現在我想獲得過的哺乳動物:

public class Koala<???, ???> : Mammal<???, ???> 

我該怎麼辦呢?

回答

1

一種解決方案是將MammalDTO設爲開放但受限的泛型類型。 然後,您可以嘗試在繼承層次結構中關閉泛型,然後繼續限制泛型。它也可能適合使用抽象類,但這不是模式的要求。老實說,我不太喜歡'自我引用泛型'模式;我覺得很困惑。

public abstract class Animal { } 
public abstract class Mammal : Animal { } 
public sealed class Koala : Mammal { } 

public abstract class AnimalDTO<TAnimal, TDTO> where TAnimal : Animal 
{ 
    public abstract TDTO ConvertToDTO(TAnimal entity);  
} 

public abstract class MammalDTO<TMammal, TMammalDTO> : AnimalDTO<TMammal, TMammalDTO> 
    where TMammal : Mammal 
    where TMammalDTO : MammalDTO<TMammal, TMammalDTO>{} 

public sealed class KoalaDTO : MammalDTO<Koala, KoalaDTO> 
{ 
    public override KoalaDTO ConvertToDTO(Koala entity) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

謝謝。我想我會試着找到另一種方式來做到這一點,因爲我也不喜歡這種模式。 – 2010-10-05 19:19:06