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