2016-09-21 23 views
0

我發現很難創建一個工廠方法返回以下基類:C#「類」是一種類型,在給定的上下文中無效時寫的工廠方法與仿製藥

public sealed class ClassA : GeneratedMessage<ClassA, ClassA.Builder>{} 
public sealed class ClassB : GeneratedMessage<ClassB, ClassB.Builder> 

public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage<TMessage, TBuilder> 
     where TMessage : GeneratedMessage<TMessage, TBuilder> 
     where TBuilder : GeneratedBuilder<TMessage, TBuilder>, new() 
     { 
     } 

public class EventFactory 
{ 

    public GeneratedMessage<TMessage, TBuilder> GetEvent<TMessage, TBuilder>(int typeId) 
      where TMessage : GeneratedMessage<TMessage, TBuilder> 
      where TBuilder : GeneratedBuilder<TMessage, TBuilder>, new() 
    { 
     switch(typeId) 
     { 
      case 1: 
       ClassA 
       beak; 
      case 2: 
       ClassB 
     } 
    } 
} 

如何寫這樣我可以返回ClassA如果1和ClassB如果2?

當我在工廠方法中使用return ClassA或ClassB時,我得到'ClassA是一個類型',它在給定的上下文中無效。

感謝

+0

從您的示例中,您需要返回實例時列出了ClassA和ClassB的類型名稱。你將如何生成實例? (例如「返回新的ClassA();」 – Jacob

+0

,因爲這些類是密封的,我們不能返回新的 –

+1

您可以創建一個密封類的實例,而不是抽象類。密封意味着您不能從類繼承。請參閱:https://msdn.microsoft.com/en-us/library/88c54tsw.aspx – Jacob

回答

0

GetEvent方法簽名應該返回此類型GeneratedMessage<TMessage, TBuilder>的對象,但你試圖返回的ClassAClassB類型的對象。此方法的客戶希望檢索任何形式的GeneratedMessage<TMessage, TBuilder>而不是其封閉變體(ClassA,ClassB,.. ClassN)。

因此,無論你做ClassA和ClassB的開放仿製藥,如:

public sealed class ClassA<TMessage, TBuilder> : GeneratedMessage<TMessage, TBuilder>{} 

和遊可以使用他們喜歡

switch(typeId) 
    { 
     case 1: 
      return new ClassA<TMessage, TBuilder>(); 
     case 2: 
      return new ClassB<TMessage, TBuilder>(); 
    } 

,或者您沒有使用此方法GetEvent作爲一個通用的一個。您爲ClassA和ClassB定義一個通用接口,實現該接口並更改簽名以使用該接口。

+0

謝謝,但我不能編輯A類或B類,因爲它來自另一個我不擁有的庫 –

+0

創建一個適配器 –

+0

不好意思說我還沒有像Adapter這樣的設計模式。你能給我提供一些鏈接和我的問題的一些例子:( –

相關問題