Реализация шаблонного интерфейса

#c# #interface #refactoring

#c# #интерфейс #рефакторинг

Вопрос:

Я пытаюсь написать это в более общем виде:

 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
}
  

Спасибо!

Комментарии:

1. Вы хотите сказать, что 2-е SetSettings является переопределением / реализацией? Вы говорите interface, но у вас есть абстрактный класс, и ваши SetSettings в ISetting — это универсальный метод, тогда как тело SetSettings, которое вы показываете ниже, таковым не является.

2. В настоящее время у меня реализован второй набор настроек. Я пытаюсь выяснить, как либо выразить 2-е SetSettings, чтобы оно могло переопределять абстрактные SetSettings, либо… Я не уверен, какие еще есть варианты.

3. Начните с указания, какой тип вы хотите сделать универсальным… Здесь есть 2 кандидата: RadDockSetting и CormantRadDock . Каким из них должен стать T ? Или оба, T1 и T2 ?

Ответ №1:

Это то, что вы пытаетесь сделать?

 // 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) { ... }
}
  

Комментарии:

1. ДА. Это было оно. Извините за мой плохой код сверху. Пятничный кофе еще не подали.

Ответ №2:

либо

     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 
} 
  

Ответ №3:

Как насчет этого:

 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);
    }
}