2011-06-10 88 views
0

我想這更一般地寫:實現一個模板接口

public static CormantRadDock RecreateDock(RadDockSetting settings) 
{ 
    CormantRadDock dock = new CormantRadDock(); 
    settings.SetSettings(dock); 
    Logger.DebugFormat("Recreated dock {0}", dock.ID); 
    return dock; 
} 

我有這樣的:

public static T Recreate<T>() where T : new() 
{ 
    T _control = new T(); 
    //settings.SetSettings(dock); 
    Logger.DebugFormat("Recreated control {0}", (_control as Control).ID); 
    return _control; 
} 

通用的解決方案:

public interface ISetting<T> 
{ 
    void SetSettings(T obj); 
} 

public void SetSettings(CormantRadDock dock) 
{ 
    // do stuff with dock 
} 

謝謝!

+0

你是說第二個SetSettings是覆蓋/實現?你說接口,但是你有一個抽象類,而你在ISetting中的SetSettings是一個通用的方法,而你在下面顯示的SetSettings主體不是。 – 2011-06-10 17:44:16

+0

我目前有第二套SetSettings實施。我想弄清楚如何表達第二個SetSettings,以便它能夠覆蓋抽象的SetSettings,或者...我不確定還有其他的選項。 – 2011-06-10 17:46:26

+0

首先聲明_什麼類型_你想成爲通用的......這裏有兩個候選人,RadDockSetting和CormantRadDock。哪一個應該變成'T'?或者兩者都是'T1'和'T2'? – 2011-06-10 17:50:54

回答

2

這是你想要做的嗎?

// move the generic type parameter up here so the interface is generic 
// and not the method definition 
public interface ISetting<T> 
{ 
    void SetSettings(T obj); 
} 

然後你就可以在一個類中成功實施:

public class SomeClass: ISetting<YourSettingType> 
{ 
    public void SetSettings(YourSettingType obj) { ... } 
} 
+0

是的。就是這樣。對不起,我的代碼很糟糕。週五的咖啡還沒有開始。 – 2011-06-10 17:49:35

0

要麼

public abstract class ISetting<T> 
{  
public abstract void SetSettings<T>(T obj); 
} 
public void SetSettings<T>(T dock) 
{  
// do stuff with dock 
} 

public abstract class ISetting<T> 
{  
public abstract void SetSettings(T obj); 
} 
public void SetSettings(T dock) 
{  
// do stuff with dock 
} 
0

如何:

public interface ICanBeRecreated<T> 
{ 
    T Recreate(); 
} 

public class CormantDock : ICanBeRecreated<CormantDock> 
{ 
    private RadDockSetting _settings; 

    private void ApplySettings(RadDockSetting settings) 
    { 
     // apply settings  
    } 

    public CormantDock Recreate() 
    { 
     var dock = new CormantDock; 
     dock.ApplySettings(_settings); 
    } 
}