2010-04-14 62 views
1

我有一個抽象基類,我有很多繼承類來。我想要做的是靜態成員需要一個字符串,第一個類可以解析字符串(只有一個繼承類應該可以)並返回繼承類的實例。使用基類的靜態方法實例化一個繼承類

這就是我目前正在做的。

public static Epl2Command GenerateCommandFromText(string command) 
{ 
    lock (GenerateCommandFromTextSyncRoot) 
    { 
     if (!Init) 
     { 
      Assembly a = Assembly.GetAssembly(typeof(Epl2Command)); 
      Types = new List<Type>(a.GetTypes()); 
      Types = Types.FindAll(b => b.IsSubclassOf(typeof(Epl2Command))); 
      Init = true; 
     } 
    } 
    Epl2Command ret = null; 
    foreach (Type t in Types) 
    { 

     MethodInfo method = t.GetMethod("GenerateCommand", BindingFlags.Static | BindingFlags.Public); 

     if (method != null) 
      ret = (Epl2Command)method.Invoke(null, new object[] { command }); 
     if (ret != null) 
      break; 
    } 
    return ret; 
} 

我想它,所以我的代碼將檢查所有繼承類,無需程序員未來回來,當他們增加更多的繼承類編輯此功能。

有沒有一種方法可以強制繼承類實現自己的GenerateCommand(string)

public static abstract Epl2Command GenerateCommand(string command)是無效的c#。 Or am I hammering a nail in with a shoe when I should be using a hammer;任何更好的方式做這個類工廠將不勝感激。

回答

1

C#不支持靜態接口,所以你不能這樣定義

public interface ICommand 
{ 
    static ICommand CreateCommand(string command); 
} 

我與凱文同意,你需要一個工廠模式的靜態構建器方法。我會更進一步,並說每個命令類型也需要一個構建器。像這樣

public interface ICommandBuilder 
{ 
    bool CanParse(string input); 
    ICommand Build(string input); 
} 

public interface ICommandBuilder<TCommand> : ICommandBuilder 
    where TCommand : ICommand 
{ 
    TCommand Build(string input); 
} 

然後你的工廠可以接受任何輸入字符串命令,查詢所有建設者,如果他們能解析該字符串,並運行建立在一個可以。

public interface ICommandFactory 
{ 
    ICommand Build(string input); 
} 

public class CommandFactory 
{ 
    public ICommand Build(string input) 
    { 
     var builder = container.ResolveAll(typeof(ICommandBuilder)) 
      .First(x => x.CanParse(input)); 
     return builder.Build(input); 
    } 
} 
+0

Jon Skeet在靜態界面上的文章。 http://goo.gl/WPpV – 2010-04-14 14:47:45

+0

承辦人從哪裏來? – 2010-04-14 14:52:21

+0

它是pseduo代碼,假設你使用控制容器的反轉... Windsor,StructureMap等。如果你不使用IoC,你必須找到所有ICommandBuilder類型並手動實例化它們。 – 2010-04-14 18:03:23

0

你所規避的就是工廠方法:

http://www.dofactory.com/Patterns/PatternFactory.aspx

這裏是一個鏈接,如何實現它。

+0

使用該模式需要爲每種不同類型的子類調用不同的類。我寧願如果我可以用一個工廠做到這一點,它會足夠聰明,可以找到所有繼承它的人,並且在每次添加類時不用編輯Epl2Command就可以吐出正確的類型。 – 2010-04-14 13:44:50