Portée de Function dans les classes dérivée [Résolu]

Messages postés
3
Date d'inscription
samedi 24 mai 2003
Statut
Membre
Dernière intervention
9 décembre 2010
- - Dernière réponse : cs_anadom
Messages postés
3
Date d'inscription
samedi 24 mai 2003
Statut
Membre
Dernière intervention
9 décembre 2010
- 2 août 2010 à 08:01
Anadom

Bonjour,

Je souhaiterais savoir s'il est possible de rendre une méthode d'une classe dérivé invisible à la form appelante.
Tout cela sans que la méthode de la classe de base soit invisible à la form appelante.
Je sais s'est pas facile a comprendre d'où l'exemple:

class myClass
Public Function FunctionaRendreInvisibleDansLaBaseQuiEnHérite() as integer

end Function
end class

class HeritéMyClass
Inherits myClass

end class

class form1
dim myClasstest1 as myClass
dim myClasstest2 as HeritéMyClass

ICI JE SOUHAITERAIS QUE:
call myClasstest1.FunctionaRendreInvisibleDansLaBaseQuiEnHérite() soit possible
MAIS QUE:
call myClasstest2.FunctionaRendreInvisibleDansLaBaseQuiEnHérite() soit Impossible

end class


J'ai dejà essayé des combinaisons avec Overrides, Shadows, Alias etc.... mais rien n'y fait...

Je suis un peu perdu, si quelqu'un a une idée...

Merci d'Avance !!!
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
4
3
Merci
Par contre en poussant un peut, on peut faire :
Public Class Class1

    Public Function Test() As Boolean
        Return True
    End Function

End Class

Public Class Class2
    Inherits Class1

    <Obsolete()> _
    <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
    Public Shadows Function Test() As Boolean
        Throw New ApplicationException("Fonction non autorisée")
    End Function

End Class


Comme ca la fonction n'apparait pas au programmeur avec l'IntelliSense pour la classe dérivée et s'il l'ecrit "manuelement" il aura un warning (certe pas une exception mais c'est deja ca, l'exception se produira à l'exécution)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 152 internautes nous ont dit merci ce mois-ci

Commenter la réponse de foliv57
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
4
0
Merci
Bonjour,

Une technique pour interdire la fonction dans les classes dérivées serait :
Public Class Class1

    Public Function Test() As Boolean
        Return True
    End Function

End Class

Public Class Class2
    Inherits class1

    Public Shadows Function Test() As Boolean
        Throw New ApplicationException("Fonction non autorisée")
    End Function

End Class

Public Class Form1
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim c1 As New Class1
        Dim c2 As New Class2

        Try
            c1.Test()
        Catch ex As Exception
            MsgBox("c1 : " & ex.Message)
        End Try

        Try
            c2.Test()
        Catch ex As Exception
            MsgBox("c2 : " & ex.Message)
        End Try

    End Sub
End Class


Pour le rendre complètement invisible, la comme ca, je n'ai pas d'idée
Commenter la réponse de foliv57
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
22 août 2018
53
0
Merci
c'est pas Sealed ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
4
0
Merci
Il me semble que Sealed (NotInheritable en VB.NET) ne peut pas s'appliquer à une methode. Uniquement à une classe pour définir une classe abstraite.
Commenter la réponse de foliv57
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
4
0
Merci
Oups enorme bétise que je dis. NotInheritable c'est justement l'inverse, c'est pour qu'on ne puisse pas l'utiliser comme classe de base dans un heritage
Commenter la réponse de foliv57
Messages postés
14456
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2019
130
0
Merci
Bonjour,

Je me pose la question du pourquoi tu en as besoin, si tu as besoin de cela car tu as une classe de base devant mettre des membres à dispo uniquement de ses classes enfant, utilises la visibilité "Protected".

(Je répond peut être à coté)

Mon site
Commenter la réponse de NHenry
Messages postés
14456
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2019
130
0
Merci
Bonjour,

Concernant l'exception à réserver dans ce cas, ce ne serait pas NotImplementedException plutôt ?

Mon site
Commenter la réponse de NHenry
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
4
0
Merci
@NHenry > Il est vrai qu'utiliser l'exception NotImplementedException sera plus judicieux que mon pauvre message. C'était juste un exemple.
Commenter la réponse de foliv57
Messages postés
3
Date d'inscription
samedi 24 mai 2003
Statut
Membre
Dernière intervention
9 décembre 2010
0
Merci
Anadom

Merci à Tous pour vos Réponses
J'ai utilisé la méthode de foliv57:

  <Obsolete()> _
    <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _


Elle fonctionne parfaitement et fait exactement ce que je voulais !!!

Encore Merci et bonne prog.
Commenter la réponse de cs_anadom