OVH Cloud OVH Cloud

Nested class and scope

5 réponses
Avatar
Pierre Alexis
Bonjour,

Je râle, je râle, je râle :-@

Pourquoi est-ce que ce code ne veut pas compiler ?

Public Class TestClass

Protected Class NestedClass
Public Sub New(ByVal p As TestClass.TestEnum)

End Sub
End Class

Protected Enum TestEnum As Integer
One
Two
End Enum

End Class

Moi j'aimerais pouvoir me créer une sous-classe contenant un champ d'un
type "Protected". Pas moyen !

L'erreur retournée est :

'p' ne peut pas exposer un type Protected en dehors de Protected class
'NestedClass'.

Je vois vraiment pas pourquoi je ne pourrais pas :-@

Merci.

--
Pierre ALEXIS
Courriel : alexispierre@hotmail.com
FAQ Visual Basic : http://faq.vb.free.fr/

5 réponses

Avatar
Pierre Alexis
Et pourquoi ceci compile-t-il ? (exactement le même code, mais en C#) :

public class TestClass
{
protected class NestedClass
{
public NestedClass(test p)
{
}
}

protected enum test : int
{
un,
deux
}
}

Aurais-je trouver un bug du compilo VB ?

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Patrice Ongla
C'est pas du tout une explication mais un constructeur public dans une
classe protected, ça me fait bizarre. La portée du constructeur dépasse
celle de sa classe. Néanmois je trouve aussi que ça devrait marcher (comme
pour private pour NestedClass et public pour son New, ça marche même si on
ne voit pas trop à quoi ça sert). Du coup j'ai regardé un peu de ce côté là
et ça ne compile pas non plus si on met le New en protected, en revanche, si
tu passes le constructeur en Friend, ça marche (mais c'est sans doute pas ce
que tu veux).
La restriction semble en effet éxagérée et inutile. Ca serait justifiée si
NestedClass était public (et d'ailleurs il refuse aussi) mais là....


"Pierre Alexis" a écrit dans le message de news:

Bonjour,

Je râle, je râle, je râle :-@

Pourquoi est-ce que ce code ne veut pas compiler ?

Public Class TestClass

Protected Class NestedClass
Public Sub New(ByVal p As TestClass.TestEnum)

End Sub
End Class

Protected Enum TestEnum As Integer
One
Two
End Enum

End Class

Moi j'aimerais pouvoir me créer une sous-classe contenant un champ d'un
type "Protected". Pas moyen !

L'erreur retournée est :

'p' ne peut pas exposer un type Protected en dehors de Protected class
'NestedClass'.

Je vois vraiment pas pourquoi je ne pourrais pas :-@

Merci.

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/


Avatar
Pierre Alexis
Patrice Ongla a écrit :

C'est pas du tout une explication mais un constructeur public dans une
classe protected, ça me fait bizarre. La portée du constructeur dépasse
celle de sa classe. Néanmois je trouve aussi que ça devrait marcher (comme
pour private pour NestedClass et public pour son New, ça marche même si on
ne voit pas trop à quoi ça sert). Du coup j'ai regardé un peu de ce côté là
et ça ne compile pas non plus si on met le New en protected, en revanche, si
tu passes le constructeur en Friend, ça marche (mais c'est sans doute pas ce
que tu veux).



Friend ne me convient pas très très bien... Car si je dérive ma classe
de base TestClass en une classe dérivée DeriveClass que je place dans un
autre assembly, ma classe encapsulée ne sera plus accessible par mon
fils (alors qu'il le faut).

La restriction semble en effet éxagérée et inutile. Ca serait justifiée si
NestedClass était public (et d'ailleurs il refuse aussi) mais là....



Clairement exagérée. D'ailleurs en C# et VB 2005, le code que j'ai collé
compile.

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Pierre Alexis
Pierre Alexis a écrit :

Je vois vraiment pas pourquoi je ne pourrais pas :-@



Les pros sont-ils d'accord que c'est un bug du compilo ?

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Patrice Ongla
Soit dit en passant, il n'y a pas très longtemps que je me suis mis
activement au dévelopement .net et, passé l'enthousiasme du début, je
commence à avoir de sérieux doutes sur la maturité de la plateforme. J'ai
mille petits pbs (dans le genre du tien) pour faire des choses simples. Et
si j'en juge au peu de réponse que je trouve sur les forums (ici ou
ailleurs), il semble que les solutions n'aillent pas de soi. Ces pbs
semblent résolus pour la plupart en VS 2005, mais que d'efforts pour peu de
chose. Productivité ? Pas encore...



"Pierre Alexis" a écrit dans le message de news:

Patrice Ongla a écrit :

C'est pas du tout une explication mais un constructeur public dans une
classe protected, ça me fait bizarre. La portée du constructeur dépasse
celle de sa classe. Néanmois je trouve aussi que ça devrait marcher
(comme pour private pour NestedClass et public pour son New, ça marche
même si on ne voit pas trop à quoi ça sert). Du coup j'ai regardé un peu
de ce côté là et ça ne compile pas non plus si on met le New en
protected, en revanche, si tu passes le constructeur en Friend, ça marche
(mais c'est sans doute pas ce que tu veux).



Friend ne me convient pas très très bien... Car si je dérive ma classe de
base TestClass en une classe dérivée DeriveClass que je place dans un
autre assembly, ma classe encapsulée ne sera plus accessible par mon fils
(alors qu'il le faut).

La restriction semble en effet éxagérée et inutile. Ca serait justifiée
si NestedClass était public (et d'ailleurs il refuse aussi) mais là....



Clairement exagérée. D'ailleurs en C# et VB 2005, le code que j'ai collé
compile.

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/