Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Interface et classe abstraite

6 réponses
Avatar
ThierryP
Comme se fait il que toutes les méthodes de l'interface IList n'apparaissent
pas dans la classe abstraite CollectionBase ? (dans l'explorateur d'objets
par exemple ou l'intellisense)
Comment est-ce possible sachant que si je crée une classe abstraite qui
hérite d'une interface je dois obligatoirement :
- soit déclarer abstract les méthodes et propriétés de l'interface
- soit implémenter les méthodes et propriétés de l'interface
Du moins c'est la réaction du compilateur...
Merci

6 réponses

Avatar
Simon Mourier [MS]
Elles sont implémentées sous la forme suivante (exemple pour IDispose):

public class Toto: IDispose
{
void IDispose.Dispose()
{
}
}

et non

public class Toto: IDispose
{
public void Dispose()
{
}
}

Dans le premier cas, l'intellisense ne montre pas Toto.Dispose(), dans le
deuxième si.

Dans le deuxième cas, je peux écrire

Toto toto = new Toto();
toto.Dispose();

et compiler.

Dans le premier cas, je dois écrire

Toto toto = new Toto();
((IDispose)toto).Dispose();

pour compiler.

Mais en terme d'implémentation, cela revient (~) au même.
Simon.

"ThierryP" <thierry_paul(a_virer)@tele2.fr> a écrit dans le message de news:

Comme se fait il que toutes les méthodes de l'interface IList
n'apparaissent
pas dans la classe abstraite CollectionBase ? (dans l'explorateur d'objets
par exemple ou l'intellisense)
Comment est-ce possible sachant que si je crée une classe abstraite qui
hérite d'une interface je dois obligatoirement :
- soit déclarer abstract les méthodes et propriétés de l'interface
- soit implémenter les méthodes et propriétés de l'interface
Du moins c'est la réaction du compilateur...
Merci




Avatar
Ambassadeur Kosh
à l'explication trés complete de Simon, je rajouterai une recommandation.

((IDisposable)toto).Dispose() compilera même si l'objet n'implante pas
IDisposable.
une traduction intermediaire permettra de tirer avantage de la compilation.

IDisposable disposable = toto ;
disposable.Dispose() ;

ainsi cette expression ne compilera pas si IDisposable n'est pas implantée.
Avatar
ThierryP
Merci pour vos infos mais j'ai beau essayer cela ne reproduit pas le
comportement de l'explorateur d'objets de VS.
Par exemple, la méthode Add() n'apparaît pas dans la classe abstraite
"CollectionBase" qui hérite pourtant de IList.
J'ai crée une interface puis une classe abstraite qui en hérite en prenant
soin comme vous l'indiquez de déclarer les méthodes et propriétés dans la
classe abstraite avec le nom de l'interface devant. Résultat, ces méthodes
et propriétés apparaissent quand même dans l'explorateur d'objet.

De plus, dans le cas de "CollectionBase" j'ai du mal à voir l'intérêt
d'avoir masqué Add(), Contains(), IndexOf(), Insert() et Remove(). Cela
empêche de voir facilement, lors du développement, les méthodes
intéressantes à implémenter (par exemple pour créer une collection fortement
typée).

Merci...


"Simon Mourier [MS]" a écrit dans le message
de news:
Elles sont implémentées sous la forme suivante (exemple pour IDispose):

public class Toto: IDispose
{
void IDispose.Dispose()
{
}
}

et non

public class Toto: IDispose
{
public void Dispose()
{
}
}

Dans le premier cas, l'intellisense ne montre pas Toto.Dispose(), dans le
deuxième si.

Dans le deuxième cas, je peux écrire

Toto toto = new Toto();
toto.Dispose();

et compiler.

Dans le premier cas, je dois écrire

Toto toto = new Toto();
((IDispose)toto).Dispose();

pour compiler.

Mais en terme d'implémentation, cela revient (~) au même.
Simon.

"ThierryP" <thierry_paul(a_virer)@tele2.fr> a écrit dans le message de


news:

> Comme se fait il que toutes les méthodes de l'interface IList
> n'apparaissent
> pas dans la classe abstraite CollectionBase ? (dans l'explorateur


d'objets
> par exemple ou l'intellisense)
> Comment est-ce possible sachant que si je crée une classe abstraite qui
> hérite d'une interface je dois obligatoirement :
> - soit déclarer abstract les méthodes et propriétés de l'interface
> - soit implémenter les méthodes et propriétés de l'interface
> Du moins c'est la réaction du compilateur...
> Merci
>
>




Avatar
Ambassadeur Kosh
class MyClass : CollectionBase
{
public void f()
{
IList list = base ; // ou this, comme vous le sentez
list.Add...
}
}

mais dans ce cas precis, la meilleure façon de faire, c'est de passer par le
membre List de la CollectionBase, qui répond exactement à ce "souci".
en fait, il fallait prendre le temps de lire, parceque tout est dans le post
de Simon...

voila voila
Avatar
ThierryP
Bonjour,
Ces forums sont trés efficaces de par leur réactivité et je tire mon chapeau
à tous les contributeurs.
Mais (cela est propre à l'écrit rapide du Net) l'art de la synthèse tout en
se faisant comprendre rapidement n'est pas aisé.
Aussi arrive t-il trés frequemment qu'il faille poser plusieurs fois une
même question, ce qui est parfois agaçant parce que l'on se demande si en
face la personne a pris le temps de la lire...
Tout comme il arrive que celui qui répond se pose la même question ;o)
Je comprend que si vous pensez vraiment que je n'ai pas bien lu le post de
Simon cela vous agace mais votre réponse ne fait qu'ajouter à la confusion.
Cessons de porter des jugements de valeur du type "il fallait prendre le
temps de lire", cela n'apporte rien et dégrade la communication.
Bien evidemment qu'il faut utiliser "list" mais cela n'a rien à voir avec ma
question surement mal formulée donc, mea culpa là dessus.

Ca tombe sur vous mais ça fait un moment que je voulais écrire ça :o)
Encore un grand merci pour votre aide, c'était juste une remarque pour être
plus efficace (j'espère ne pas être compris de travers ce coup ci
:o))))))))))
Thierry.




"Ambassadeur Kosh" a écrit dans le message de
news: #
class MyClass : CollectionBase
{
public void f()
{
IList list = base ; // ou this, comme vous le sentez
list.Add...
}
}

mais dans ce cas precis, la meilleure façon de faire, c'est de passer par


le
membre List de la CollectionBase, qui répond exactement à ce "souci".
en fait, il fallait prendre le temps de lire, parceque tout est dans le


post
de Simon...

voila voila




Avatar
Ambassadeur Kosh
> Je comprend que si vous pensez vraiment que je n'ai pas bien lu le post de
Simon cela vous agace mais votre réponse ne fait qu'ajouter à la
confusion.



ne pensez pas que je suis agacé. il en faut un peu plus :o)
j'essayais d'attirer votre attention sur le fait que cette "disparition"
dans la
classe abstraite est exactement liée à ce qu'il expliquait.

le mécanisme de "visibilité" est devenu plus complexe de nos jours.
c'est cette notion d'implantation "explicite" et "implicite" est la clef.

Cessons de porter des jugements de valeur du type "il fallait prendre le
temps de lire", cela n'apporte rien et dégrade la communication.



il ne s'agit pas de ça.

Bien evidemment qu'il faut utiliser "list" mais cela n'a rien à voir avec
ma
question surement mal formulée donc, mea culpa là dessus.



il faut, non ! c'est une façon de faire. il y'en a d'autres.

mais reprenons : si les membres de IList etaient visibles directement, toute
personne dérivant de CollectionBase aurait la possibilité directe
d'appliquer un Add(object), ce qui est un peu domage pour une liste
fortement typée. on peut ainsi mélanger chiens et chats dans une liste de
castors. notez bien qu'on peut le faire de toute façon par le biais de
IList, mais au moins, ça a l'avantage de rendre l'action deliberée.

de nombreuses fois, j'ai pu observer que le mécanisme "implicit/explicit"
venait compenser l'absence de genericité.
voyez, c'est encore une autre façon de faire : utiliser un mécanisme
différent !

et pour répondre à votre derniere question : CollectionBase est une
implantation de IList. donc dans CollectionBase, this est directement
consideré comme IList, et tous ses membres sont visibles. à l'interieur de
la classe (ce qui est pratique) et par l'exterieur, ce qui est facheux.

la morale de cette histoire, c'est que l'heritage d'implantation, ça daube.
voila voila.