2014-02-05 2 views
1

У меня есть иерархия объектов ISomething, и теперь я пытаюсь получить отдельные объекты для вычисления параметров для объектов ISomething. Я ожидаю довольно много однозначного сопоставления.Связывание двух иерархий с использованием генераторов

public interface ISomething 
{ 
    void SetParameters(IParameters p); 
} 

public interface IParameterCalculator<TSomething> where TSomething : class, ISomething 
{ 
    IParameters Calculate(); 
} 

Я хотел бы сделать это немного более безопасным, например. чтобы параметры, рассчитанные данным калькулятором, соответствовали только соответствующему объекту. Поэтому я попытался сделать параметры родовыми:

public interface IParameterCalculator<TSomething> where TSomething : class, ISomething 
{ 
    IParameters<TSomething> Calculate(); 
} 

Я не уверен, как это использовать в интерфейсе ISomething. В C++ есть стандартные хаки с шаблонами для достижения этого, есть ли подобные методы в C#? Или любые другие идеи о том, как связать иерархию IParameterCalculator с ISomething безопасным типом?

+2

Не могли бы вы показать пример классов, которые могли бы реализовать эти интерфейсы (в необщем способе), так что мы можем попытаться обобщить этот конкретный пример. Как бы то ни было, я просто не вижу, что вы на самом деле пытаетесь сделать с этими интерфейсами. – Servy

+0

Рассчитывает настройку параметров? Я смущен, потому что я бы предположил, что вам нужно будет установить параметр перед вызовом метода вычисления. Чего вы действительно пытаетесь достичь? Можете ли вы представить реальный пример? –

+0

@Servy В следующем вопросе есть пример http://stackoverflow.com/questions/21599639/how-to-avoid-redundant-code-without-undesirable-double-cast-of-generics. – Lijo

ответ

2

Один из способов сделать это было бы сделать IParameters также надежен на ISomething с, и вы также должны будете объявить ISomething как принимать параметр самостоятельного типа:

public interface ISomething<S> { 
    void SetParameters(IParameters<S> p); 
} 

public interface IParameterCalculator<TSomething> where TSomething : class, ISomething<TSomething> { 
    IParameters<TSomething> Calculate(); 
} 

Так ISomething s есть объявлять передавая свой собственный тип к интерфейсу:

public class Something : ISomething<Something> { 
    ... 
} 

Обратите внимание, что это не мешает таким проблемам, как в ISomething не объявляя себя в качестве параметра типа, и вы должны будете также изменить IParameters - общий. Таким образом, вы должны сбалансировать параметры дополнительного типа и их смысловые ограничения (самонастраивающиеся), которые они принесут вам.

Это называется странно повторяющийся узор шаблона в C++ ...

1

Это интересный вопрос.

Я считаю, что должно работать:

public interface ISomething<TSomething> 
{ 
    void SetParameters(IParameters<TSomething> p); 
} 

public interface IParameterCalculator<TSomething> 
where TSomething : class, ISomething<TSomething> 
{ 
    IParameters<TSomething> Calculate(); 
} 
Смежные вопросы