C# 实现模板化接口

C# 实现模板化接口,c#,interface,refactoring,C#,Interface,Refactoring,我试着更笼统地写这个: public static CormantRadDock RecreateDock(RadDockSetting settings) { CormantRadDock dock = new CormantRadDock(); settings.SetSettings(dock); Logger.DebugFormat("Recreated dock {0}", dock.ID); return dock; } 我有这个: public s

我试着更笼统地写这个:

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 static T Recreate(),其中T:new()
{
T_控制=新的T();
//设置。设置设置(船坞);
DebugFormat(“重新创建的控件{0}”,(_controlas control).ID);
返回控制;
}
通用解决方案:

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

public void SetSettings(CormantRadDock dock)
{
    // do stuff with dock
}
公共接口设置
{
空隙设置(T obj);
}
公共空间设置(CormantRadDock码头)
{
//和码头打交道
}

谢谢

这就是你想要做的吗

// 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);
}
//将泛型类型参数移到此处,使接口为泛型
//而不是方法定义
公共接口设置
{
空隙设置(T obj);
}
然后您可以在类中成功实现它:

public class SomeClass: ISetting<YourSettingType>
{
    public void SetSettings(YourSettingType obj) { ... }
}
公共类SomeClass:ISetting
{
公共无效设置(YourSettingType obj){…}
}
或者

    public abstract class ISetting<T> 
{     
public abstract void SetSettings<T>(T obj); 
}  
public void SetSettings<T>(T dock) 
{     
// do stuff with dock 
} 
公共抽象类设置
{     
公开摘要无效设置(T obj);
}  
公共空间设置(T船坞)
{     
//和码头打交道
} 

公共抽象类设置
{     
公开摘要无效设置(T obj);
}  
公共空间设置(T船坞)
{    
//和码头打交道
} 
这个怎么样:

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);
    }
}
已创建公共接口
{
T重新创建();
}
公共类CormantDock:已创建
{
专用RadDockSetting_设置;
专用无效应用程序设置(RadDockSetting设置)
{
//应用设置
}
公共CormantDock())
{
var dock=新CormantDock;
dock.ApplySettings(_设置);
}
}

您是说第二次设置是覆盖/实现吗?你说的是接口,但你有一个抽象类,你在ISetting中的SetSettings是一个通用方法,而你下面展示的SetSettings主体不是。我目前已经实现了第二个SetSettings。我试图找出如何表达第二个集合设置,以便它能够覆盖抽象集合设置,或者。。。我不确定还有什么其他选择。请先说明您希望成为泛型的类型。。。这里有两个候选者,RadDockSetting和CormantRadDock。哪个应该成为
T
?或者两者都有,
T1
T2
?是。就是这样。对不起,我的代码太差了。星期五的咖啡还没有开始。
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);
    }
}