No passado, eu usava herança para permitir a extensão de formulários do Windows no meu aplicativo. Se todos os meus formulários tivessem controles, arte-final e funcionalidade comuns, eu criaria um formulário básico implementando os controles e a funcionalidade comuns e permitiria que outros controles fossem herdados desse formulário base. No entanto, eu tive alguns problemas com esse design.
Os controles podem estar apenas em um contêiner por vez, portanto, qualquer controle estático que você tiver será complicado. Por exemplo: Suponha que você tenha um formulário base chamado BaseForm que contenha um TreeView que você torne protegido e estático, para que todas as outras instâncias (derivadas) dessa classe possam modificar e exibir o mesmo TreeView. Isso não funcionaria para várias classes herdadas do BaseForm, porque esse TreeView pode estar apenas em um contêiner por vez. Provavelmente estaria no último formulário inicializado. Embora cada instância pudesse editar o controle, ele seria exibido apenas em um de cada vez. Claro, existem soluções alternativas, mas todas são feias. (Este parece ser um projeto muito ruim para mim. Por que vários contêineres não podem armazenar ponteiros para o mesmo objeto? De qualquer forma, é o que é.)
Estado entre formulários, ou seja, estados de botão, texto da etiqueta etc., eu tenho que usar variáveis globais e redefinir os estados no Load.
Isso realmente não é muito bem suportado pelo designer do Visual Studio.
Existe um design melhor, mas ainda assim, de fácil manutenção para usar? Ou a herança de forma ainda é a melhor abordagem?
Atualização Passei de MVC para MVP, para o Observer Pattern e o Event Pattern. Aqui está o que estou pensando no momento, por favor, critique:
Minha classe BaseForm conterá apenas os controles e eventos conectados a esses controles. Todos os eventos que precisam de qualquer tipo de lógica para lidar com eles serão transmitidos imediatamente para a classe BaseFormPresenter. Essa classe manipulará os dados da interface do usuário, executará qualquer operação lógica e atualizará o BaseFormModel. O Modelo exporá eventos, que serão acionados com alterações de estado, à classe Presenter, na qual ele se inscreverá (ou observará). Quando o Apresentador recebe a notificação do evento, ele executa qualquer lógica e, em seguida, o Apresentador modifica a Visualização de acordo.
Haverá apenas uma de cada classe Model na memória, mas pode haver muitas instâncias do BaseForm e, portanto, do BaseFormPresenter. Isso resolveria meu problema de sincronizar cada instância do BaseForm com o mesmo modelo de dados.
Questões:
Qual camada deve armazenar itens como o último botão pressionado, para que eu possa mantê-lo destacado para o usuário (como em um menu CSS) entre os formulários?
Critique por favor este design. Obrigado pela ajuda!