Quero implementar o padrão typestate em C#. Eu tentei algo como:
interface Open {}
interface Closed {}
abstract class Foo<T> { }
class Bar<T> where T: Closed { }
class Bar<T> where T: Open { }
bem como outras permutações, mas todas acabam com a reclamação do compilador. Este exemplo específico fornece (via https://www.programiz.com/csharp-programming/online-compiler/ ):
/tmp/qmk1tTLHWG.cs(12,11): error CS0101: The namespace 'baz' already contains a definition for 'Bar'
/tmp/qmk1tTLHWG.cs(11,11): error CS0265: Partial declarations of 'Bar<T>' have inconsistent constraints for type parameter 'T'
Não sei o suficiente sobre o sistema de tipos do C# para saber o que realmente funcionará e não consigo encontrar muita documentação sobre como fazer isso. É possível implementar o padrão de estado de tipo? Encontrei o blog de Adam , mas ele na verdade não implementa o padrão de estado de tipo conforme mostrado em 1 , que é o que eu gostaria de fazer, se possível.
Idealmente eu gostaria de algo como
struct Closed { };
struct Open { };
class Foo<T> {
// functions applicable to Foo's in both the Closed and Open states
}
class Foo<Closed> {
// functions applicable to Foo's in just the Open state
}
class Foo<Open> {
// functions applicable to Foo's in just the Open state
}
Você deve modelar isso por meio de interfaces, mas só precisa haver uma única classe.
Um exemplo:
Você pode estender isso forçando um estado padrão
Foo
usando um método de fábrica: