Existe um objeto base para AC# enum?
-
20-09-2019 - |
Pergunta
Sei que você não pode usar a herança com enums; portanto, na minha classe base, quero definir que as classes que o implementam devem retornar um enumeração de algum tipo para uma propriedade.
Idealmente, isso seria como:
public abstract BaseEnum MyEnum { get; set; }
Em seguida, todos os implementadores teriam que retornar alguma forma de enum. Mas, obviamente, Baseenum não existe. Eu posso usar objeto, mas prefiro não.
Existe uma boa maneira de fazer isso?
Editar: Estou perguntando isso porque eu essencialmente quero manter o nome da propriedade nas classes implementadoras da mesma forma - eu sei que não poderei trabalhar com a enumeração na classe base, mas se eu não colocasse Na base, as classes implementadoras poderiam decidir sobre seus próprios nomes de propriedades para sua enumeração, o que pode se tornar incerto ao longo do tempo, pois eles iriam para suas próprias implementações.
Solução
O mais próximo que você pode facilmente chegar em C# é tornar o tipo genérico com uma restrição de estrutura:
public abstract class BaseClass<T> where T : struct
{
public abstract T MyEnum { get; set; }
}
então
public class DerivedClass : BaseClass<SomeEnum>
O C# não permite especificar uma restrição que o restringe aos tipos de enumeração, mesmo que a CLI a apoie. Eu tenho um projeto chamado Melodia irrestrita que usa truques pós -construção para aplicar essa restrição - mas eu não sugeriria que você adote a mesma abordagem, a menos que esteja se sentindo um pouco ousado. A restrição da estrutura o limitará pelo menos a tipos de valor, o que pode ser bom o suficiente.
Outras dicas
Todos os enumes herdam do System.enum.
Você deve dar uma olhada aqui: Enumera “herança”:
See section 8.5.2 of the CLI spec for the full details. Relevant information from the spec * All enums must derive from System.Enum * Because of the above, all enums are value types and hence sealed