Minotthor
Messages postés72Date d'inscriptionvendredi 16 mai 2003StatutMembreDernière intervention12 août 2009
-
16 oct. 2005 à 01:10
Minotthor
Messages postés72Date d'inscriptionvendredi 16 mai 2003StatutMembreDernière intervention12 août 2009
-
16 oct. 2005 à 14:12
Tout d'abord, trois petites question :
Est-il possible d'hériter d'une classe dont tous les constructeurs sont
"private" ? En fait elle crée ses instances à partir d'une méthode
statique sur le schema de System.Reflection. Assembly
System.Reflection.Assembly.LoadFrom (string).
Quand une exception survient dans un constructeur, qu'advient-il de
l'instance que ce constructeur était censé initialiser ? Je m'explique
: si j'étais sûr qu'en cas d'erreur ce sera bien un null qui sera
retourné par la new à la référence et pas l'adresse d'une instance à
moitié initialisée, inutilisable et provoquant des erreurs en série, je
pourrais me passer d'utiliser une ****** de methode statique comme
substitut au constructeur.
Est-il possible de forcer un constructeur à renvoyer null à la
référence dans un cas particulier comme on ferait un return null dans
une méthode classique ?
Ensuite, plus compliqué :-p !
C'est un système de classes destiné à l'internationalisation (programme
polyglotte). La classe de base est Excubitor.Binders.LateBinder (je
n'inclus pas le code des méthodes pour ne pas encombrer mais si il vous
intéresse n'hésitez pas à le demander, j'enverrai les fichiers du
projet et de toute façon tout sera posté sur ce site quand je jugerai le travail digne d'intérêt) :
La classe de base :
namespace Excubitor.Binders
{
public class LateBinder
{
private System.Reflection.Assembly Assembly ;
private System.Type Type ;
private object Instance ;
protected internal LateBinder () {}
public static LateBinder Load (string Path, string Type) {[...]}
L'intérêt est évidemment de pouvoir gérer des languages complexes en
composant les phrases à l'aide d'arguments passés à la méthode,
d'appeler cette méthode comme s'il s'agissait d'une méthode locale
("Language.Hello ()") et ce sans même savoir quelle DLL a été
late-bound.
Mais c'est là que ça cloche :
LateLanguageBinder Language = LateLanguageBinder.Load
(@"E:\Programmation\Excubitor\Sodalitas\Languages\French\bin\Debug\French.dll",
"Excubitor.Sodalitas.Languages.French") ;
E:\Programmation\Excubitor\Sodalitas\Sodalitas\MainClass.cs(7): Cannot
implicitly convert type 'Excubitor.Binders.LateBinder' to
'Excubitor.Sodalitas.Sodalitas.LateLanguageBinder'
Ceci ne râle pas à la compilation mais plante à l'exécution :
LateLanguageBinder Language = (LateLanguageBinder)
LateLanguageBinder.Load
(@"E:\Programmation\Excubitor\Sodalitas\Languages\French\bin\Debug\French.dll",
"Excubitor.Sodalitas.Languages.French") ;
An unhandled exception of type 'System.InvalidCastException' occurred in Sodalitas.exe
Additional information: Specified cast is not valid.
Je comprends le problème : j'essaye de faire passer un cube dans un trou triangulaire et .NET n'aime pas ça !
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 16 oct. 2005 à 11:23
Salut, utilises un constructeur protected pour dériver ta classe. En cas d'exception dans un constucteur l'object n'est pas créé, ( à moins de catcher l'exception à l'interieur du ctor. ) Pour les ctor statics c'est différent une TypeInitialisationException est lancée.