Jump to content

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


Guest id194
 Share

Recommended Posts

Guest id194

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...

Link to comment
Share on other 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?

Desaparecido.

Link to comment
Share on other sites

Guest id194

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...

Link to comment
Share on other 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();

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Guest id194

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.

Link to comment
Share on other 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.

Daniel Amorim

VP for xRTML

http://www.xrtml.org http://www.realtime.co

Link to comment
Share on other sites

Chegaste a ler o que escrevi?

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

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other 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.

Daniel Amorim

VP for xRTML

http://www.xrtml.org http://www.realtime.co

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.