Я пытаюсь реализовать шаблон посетителя для моей структуры данных, основанный на иерархии классов. В C# вы не можете включать типы (пока). Я думал о том, делать что-то подобное в качестве замены:C# Func <Interface> с полиморфизмом
public MyAlgorithm : Func<IBase, X> {
// default:
public X apply(IBase data) {}
// case param1 is ConcreteSubclass
public X apply(ConcreteSubclass data) {}
// case param1 is ConcreteOtherClass
public X apply(ConcreteOtherClass data) {}
}
А затем вызвать его с конца связанной отправки:
public ICanApplyAlgorithmOn {
public void apply(Func<IBase> alg);
public TResult apply<TResult>(Func<IBase,TResult> alg);
public TResult apply<TParam1,TResult>(Func<IBase, TParam1, TResult> alg);
// etc.
}
public abstract Base : ICanApplyAlgorithmOn {
// etc.
public TResult apply(Func<IBase, X> alg) {
// Hopefully I am correct in deducing that this will call the various apply(...) implementations instead of always method(IBase)
dynamic me = this;
return alg(me);
}
// etc.
}
Однако, это не будет работать, так как MyAlgorithm
не может наследовать от делегат Func<...>
.
Единственное решение, которое я видел, - это определить множество собственных интерфейсов, например следующее. Есть ли способ лучше?
public interface IAlgorithm { public void apply(IBase data); }
public interface IAlgorithm<TReturn> { public TReturn apply(IBase data); }
public interface IAlgorithm<TP1, TReturn> { public TReturn apply(IBase data, TP1 param1); }
// etc.
Мне непонятно, какая из следующих целей ваша действительная. Ваша цель - реализовать шаблон посетителя? В целом, чтобы добиться множественной отправки? Переопределить ли делегат? –