public class StepClause
{
public NamedStepClause Action1() {}
public NamedStepClause Action2() {}
}
public class NamedStepClause : StepClause
{
public StepClause Step(string name) {}
}
Básicamente, quiero ser capaz de hacer algo como esto:diseño de la interfaz y el código Fluido huelen
var workflow = new Workflow().Configure()
.Action1()
.Step("abc").Action2()
.Action2()
.Step("def").Action1();
Así, algunos "pasos" se nombran y algunos no lo son.
Lo que no me gusta es que StepClause tenga conocimiento de su clase derivada NamedStepClause.
Intenté un par de cosas para hacer que esto sienta mejor conmigo. Traté de mover las cosas a las interfaces, pero luego el problema simplemente se trasladó del hormigón a las interfaces: INamedStepClause aún debe derivarse de IStepClause e IStepClause necesita devolver INamedStepClause para poder llamar a Step(). También podría hacer que Step() forme parte de un tipo completamente separado. Entonces no tienen este problema y nos gustaría tener:
var workflow = new Workflow().Configure()
.Step().Action1()
.Step("abc").Action2()
.Step().Action2()
.Step("def").Action1();
que está bien, pero me gustaría hacer el paso a nombrar opcional si es posible.
Encontré esta otra publicación en SO here que parece interesante y prometedora. ¿Cuáles son sus opiniones? Creo que la solución original es completamente inaceptable o no?
Por cierto, esos métodos de acción tomarán predicados y funtores y no creo que quiera tomar un parámetro adicional para nombrar el paso allí.
El objetivo de todo esto es, para mí, definir solo estos métodos de acción en un solo lugar y en un solo lugar. Entonces, las soluciones del enlace al que se hace referencia utilizando genéricos y métodos de extensión parecen ser los mejores enfoques hasta ahora.
Simplemente no me gusta la mayoría de las respuestas que recibo. La otra razón es que lo olvido; P –