Héritage avec :this() ? [Résolu]

Signaler
Messages postés
56
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 août 2008
-
Messages postés
56
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 août 2008
-
Bonjour,

j'ai un problème quasiment le même que celui qui est posté à ce lien:
http://www.csharpfr.com/infomsg_RELATION-ENTRE-FORME-BESOIN-AIDE-SVP_991185.aspx

cette personne a reçu une réponse de SharpMao, et ma question porte sur le code qu'il a donné dont je fais un copier coller ici:
Alores, voici un petit exemple :

public partial class Form1 : Form
{
    private Form2 _f2= null;
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (_f2 == null)
            _f2 = new Form2(this);
        _f2.Show();
        Hide();
    }
}

Et la Form2 :

public partial class Form2 : Form
{
    private Form1 _f1 = null;
    private Form2()
    {
        InitializeComponent();
    }

    public Form2(Form1 f1):this() // ici je bloque, je comprend pas
    {
        _f1 = f1;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _f1.Show();
        Hide();
    }
}

Ce que je vois, c'est que le constructeur Form2 hérite de this(), qu'est-ce que ca veut dire ? D'ailleurs j'entends plutôt parler de class qui hérite d'une classe, c'est la première fois que je vois un constructeur qui fait de l'héritage.
SharpMaoa d'ailleurs fourni une explication sur le topic, mais j'ai pas réussi à le comprendre, je cite:
Avec ce constructeur tu permets à ton Form2 de connaître un Form1, et donc de l'afficher si besoin est.
Je vois pas à quoi ca sert que Form2 connaisse Form1, puisque Form1 est Form1 et on peut pas créer une nouvelle instance de Form1 sous peine de réinitialiser ces textbox par exemple.. donc voilà c'est un peu ambigu pour moi ca.

Pourriez vous m'aider à comprendre ?
Merci d'avance.

3 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Salut, ce n'est pas de l'héritage..

public class Base
{
    // Appelle le constructeur de cette classe
    // qui attend 2 arguments de type int.
    protected Base( int x ) : this( x, 1 )
    {
    }


    // Appelle le constructeur de la classe Object.
    private Base( int x, int y ) : base( )
    {
        MessageBox.Show( String.Format( "x={0} et y={1}", x, y ) );
    }
}


public class Derivee : Base
{
    // Appelle le constructeur de cette classe
    // qui attend 1 argument de type int.
    public Derivee( ) : this( 1 )
    {
    }


    // Appelle le constructeur de la classe de base
    // qui attend 1 argument de type int.
    private Derivee( int x ) : base( x )
    {
    }
}

"Je vois pas à quoi ca sert que Form2 connaisse Form1, puisque Form1 est Form1 et on peut pas créer une nouvelle instance de Form1 sous peine de réinitialiser ces textbox par exemple.. "

On ne souhaite pas créer une nouvelle Forme1, juste maintenir une référence sur elle, ce qui permet d'utiliser ses méthodes publics depuis Form2.
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
Hello,

Comme l'a dis Lutinor, :this() fait un appel au constructeur sans paramètres du même objet.
On aurait aussi pu ne pas faire cet appel, et mettre InitializeComponent directement dans le constructeur qui prend un paramètre.
Comme tu as besoin que ta Form2 connaisse une instance de Form1, j'ai préféré gardé le constructeur par défaut, mais le passer en privé, pour ne pas pouvoir créer de Form2 sans Form1.

J'ai également l'impression que tout n'est pas clair pour toi sur la différence entre une classe et une instance de cette classe.

Form1 et Form2 sont des classes.

Lorsque tu fais _f2 = new Form2(this); tu crées une nouvelle instance de Form2 en lui passant en paramètre une instance de Form1 (this).

Les seules méthodes ou propriétés que tu peux appeler sur ces classes sans les instancier, sont des méthodes ou propriétés statiques.
Les méthodes statiques ne sont pas utilisables dans ton cas, car chaque instance de Form1 doit avoir son propre TextBox, et pas le partager avec les autres.
C'est pour cette raison que tu ne pouvais pas faire Form1.textbox1.Text, textbox1 n'appartiens pas à la classe Form1, mais à ses instances.

J'espère que tu auras un peu mieux compris, et si je n'ai pas été très clair, n'hésite pas à redemander.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
56
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 août 2008
1
Merci beaucoup pour les explications.