Héritage avec :this() ?

Résolu
ericdu93 Messages postés 56 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 août 2008 - 5 mars 2008 à 01:57
ericdu93 Messages postés 56 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 août 2008 - 5 mars 2008 à 11:25
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
5 mars 2008 à 03:50
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.
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
5 mars 2008 à 08:12
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)
3
ericdu93 Messages postés 56 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 août 2008 1
5 mars 2008 à 11:25
Merci beaucoup pour les explications.
0
Rejoignez-nous