none
Problème d'héritage et de références RRS feed

  • Question

  • Bonjour à toutes et à tous,

    Nous développons une solution avec Visual Studio 2008 (une application WPF avec des librairies en C#). Pour cela, nous utilisons, entre autres, des composants développés par une entreprise tierce. Ne voulant pas utiliser directement ces composants et désirant les enrichir avec de nouvelles fonctions, nous avons créé des classes de base héritant directement des classes de ces composants. Seulement il semblerait que nous soyons obliger de les référencer tout de même pour utiliser nos classes de bases sinon nous obtenons un message d'erreur lors de la compilation :

    Le type 'Type' est défini dans un assembly qui n'est pas référencé. Vous devez ajouter une référence à l'assembly 'Type, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

    Voici un petit exemple simple pour vous démontrer plus clairement notre problème :

    Nous avons une solution avec 3 projets (une application wpf et 2 bibliothèque de classes) :

    La première bibliothèque de classes représente les composants développé par l'entreprise tierce :

     

    namespace ClassLibrary1
    {
        public class Class1
        {
            public string Test()
            {
                return "Test !";
            }
        }
    }

    La deuxième bibliothèque de classes représente nos classes de base :

     

    using ClassLibrary1;
    
    namespace ClassLibrary2
    {
        public class Class2 : Class1
        {
            public new string Test()
            {
                return string.Concat("Class 2 : ", base.Test());
            }
        }
    }

    Pour finir, l'application WPF est juste composée d'un bouton avec un événement "Click". Voici le code-behind :

    using ClassLibrary2;
    
    namespace WpfApplication1
    {
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                Class2 obj = new Class2();
    
                MessageBox.Show(obj.Test());
            }
        }
    }

    Notre problème, c'est qu'il semble que nous soyons obligé de référencer les deux projets de bibliothèque de classes dans notre projet "WpfApplication1" alors que nous voudrions référencer que la bibliothèque de classes "ClassLibrary2".

    Quelqu'un a-t-il une solution ?

    Merci d'avance et bonne journée.

    mercredi 24 mars 2010 07:06

Réponses

  • Bonjour,

     

    Parce-que la deuxième classe est dérivée, le constructeur de la classe parent est appelé a l’initialisation de l’objet. Vous devez donc déclarer la référence vers l’assembly de la classe parent.

     

    Y a-t-il une raison particulière pour ne pas inclure la référence dans le projet ?

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Niki1291 jeudi 25 mars 2010 13:06
    mercredi 24 mars 2010 13:25
  • Bonjour,

     

    On ne garde pas des références inutiles. Vous avez besoin quand-même de la première référence, car votre classe est dérivée à base d’elle. Si vous avez une référence dans plusieurs projets de la même solution, ça ne signifie pas que vous multiplies vos fichiers assembly. Quand vous compilez votre solution, vous n’aurez qu’une seule assembly, même si elle est référenciée dans plusieurs projets.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Niki1291 jeudi 25 mars 2010 13:06
    jeudi 25 mars 2010 11:53

Toutes les réponses

  • Bonjour,

     

    Parce-que la deuxième classe est dérivée, le constructeur de la classe parent est appelé a l’initialisation de l’objet. Vous devez donc déclarer la référence vers l’assembly de la classe parent.

     

    Y a-t-il une raison particulière pour ne pas inclure la référence dans le projet ?

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Niki1291 jeudi 25 mars 2010 13:06
    mercredi 24 mars 2010 13:25
  • Oui, mais elle n'est pas appelée par l'application WPF directement mais bien par la "ClassLibrary2". Non ?

    En supprimant les références inutilisées on réduit la taille de l'application (et c'est un peu plus propre aussi, pourquoi garder des références ou des "using" inutiles ?).

    Selon certains collègues cela permettra aussi, dans le cas ou nous décidons de changer de composants, de minimiser le code à changer (<-- pour ma part je suis un peu septique sur ce point).

    mercredi 24 mars 2010 14:58
  • Bonjour,

     

    On ne garde pas des références inutiles. Vous avez besoin quand-même de la première référence, car votre classe est dérivée à base d’elle. Si vous avez une référence dans plusieurs projets de la même solution, ça ne signifie pas que vous multiplies vos fichiers assembly. Quand vous compilez votre solution, vous n’aurez qu’une seule assembly, même si elle est référenciée dans plusieurs projets.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Niki1291 jeudi 25 mars 2010 13:06
    jeudi 25 mars 2010 11:53