• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Modificar uma classe base sem usar herança, possível?

9 mensagens neste tópico

Estou aqui com um pequeno problema que não faço ideia se é possível ou não fazer, mas algo me diz que não. No entanto, como não sei, mais vale é perguntar...

Imaginemos o objecto Form, eu preciso de lhe alterar algumas propriedades para que todos os meus forms (que automaticamente herdam da classe Form) tenham essas propriedades alteradas, ou seja, alterar certas propriedades por omissão.

Uma solução seria criar uma classe MyForm (por exemplo) que herdasse da classe Form e depois no construtor de MyForm, alterava as propriedades que queria. De seguida, bastava que todos os meus forms herdassem de MyForm em vez de Form e estava o problema resolvido.

Mas isto implica eu ter que alterar a herança automática dos forms de Form para MyForm e eu queria evitar isto. Ou seja, queria que os forms continuassem a herdar de Form mas com certas alterações ás propriedades desta classe.

Isto é possível? Como?

Desculpem se não me expliquei bem, mas não sei como o fazer melhor...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só se alterasses a classe Form no código-fonte da Framework, e voltasses a compilar... :)

Outra maneira que não seja a que disseste não conheço. Alguma razão para não quereres derivar Form, além do automatismo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já me disseram no IRC que não é possível fazer exactamente o que quero, alterar as classes base. Mesmo agora que o código da framework anda por ai, mas não tenho interesse nisso.

Porque queria evitar ter que alterar a herança de cada form manualmente quando eu faço "Add Form" e ele cria um novo form que herda de Form e assim já estava feito e não precisava de alterar nada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com disseste, herança é uma hipótese.

Outra hipótese é usares "Extension Methods" disponível no C#3.0. Também não é perfeito, apesar de não precisares de alterar a herança automática dos forms, tinhas que por a evocar manualmente o método.

Por exemplo, tinhas definido numa classe qualquer o seguinte código.

public static MyForm {
  public static void SetProperties(this Form f) {
    f.WindowState = FormWindowState.Maximized;
    f.MaximizeBox = false;
    f.MinimizeBox = false;
}
}

Depois tens de evocar o método. Poderias acrescentar ao construtor do Form.

public partial class Form1 : Form {
   public Form1() {
      InitializeComponent();
      SetProperties();
   }
}

Ou então acrescentares a quando crias o form.

// codigo etc e tal
Form1 f = new Form1();
f.SetProperties();

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não vai funcionar para o que eu quero... As mudanças que eu quero fazer precisam de ser visíveis em design-time e com essa tua solução, apenas serão vistas em run-time.

Obrigado na mesma a todos, vou optar por herança.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra hipótese é usares "Extension Methods" disponível no C#3.0. Também não é perfeito, apesar de não precisares de alterar a herança automática dos forms, tinhas que por a evocar manualmente o método.

Os "Extension Methods" apenas permitem redefinir novas funcionalidades, se criares um método com um nome já existente na classe será sempre invocado o método da classe e nunca o por ti criado. Caso isto não fosse assim era a loucura...

Fazer novos métodos para alterar propriedades não tem lógica, pois não se tinha de afectar as propriedades, mas era necessário invocar os métodos.

A única forma de fazeres o que queres é usando herança.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Chegaste a ler o que escrevi?

Quem falou de criar um método com um nome já existente na classe?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Claro que vi o que escreveste e também não disse que falaste em criar um método com o nome de um já existente em Form.

Talvez se tivesse dito primeiro que na minha opinião não tem lógica criar "Extension Methods" para ter um indirecção e só depois falasse que noutros casos também não resulta devido ao que já referi terias-me entendido melhor.

Como fazes estas a adicionar um método para uma dada configuração de Form, imagina que agora cria outra configuração... criava outro método? Para mim não tem muita lógica. Mas bem, esta conversa começa torta à nascença, pois o que o Nazgulled pergunta vai contra a ideia do Object Oriented. Se queremos particularizar uma classe criamos uma classe que implemente esse caso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora