J'utilise une bibliothèque qui génère un tas de classes pour moi.Comment appeler une méthode de sous-classe sur un objet baseclass?
Ces classes héritent toutes d'une classe de base commune, mais cette classe de base ne définit pas de méthodes communes à toutes les sous-classes.
Par exemple:
SubClassA : BaseClass{
void Add(ItemA item) {...}
ItemA CreateNewItem() {...}
}
SubClassB: BaseClass{
void Add(ItemB item) {...}
ItemB CreateNewItem() {...}
}
Malheureusement, la classe de base n'a pas ces méthodes. Ce serait formidable:
BaseClass{
// these aren't actually here, I'm just showing what's missing:
abstract void Add(ItemBaseClass item); // not present!
abstract ItemBaseClass CreateNewItem(); // not present!
}
Comme il existe une classe de base commune pour mes objets A + B et une classe de base commune pour les objets Item, je l'avais espéré profiter du merveilleux monde du polymorphisme.
Malheureusement, comme les méthodes communes ne sont pas réellement présentes dans la classe de base, je ne peux pas les appeler virtuellement. par exemple, ce serait parfait:
BaseClass Obj;
Obj = GetWorkUnit(); // could be SubClassA or SubClassB
ItemBaseClass Item = Obj.CreateNewItem(); // Compile Fail: CreateNewItem() isn't in the base class
Item.DoSomething();
Obj.Add(Item); // Compile Fail: Add(...) isn't in the base class
coulée De toute évidence fonctionnerait, mais je aurais besoin de savoir quel type j'avais qui annulerait les avantages. Comment puis-je "forcer" un appel à ces méthodes? Je ne m'inquiète pas d'obtenir un objet qui n'applique pas la méthode que j'essaie d'appeler. Je peux réellement faire ce que je veux en VB - je ne suis pas IntelliSense, mais est content et il fonctionne le compilateur:
CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
againt, je n'ai pas le contrôle de ces classes (que je pense que les règles sur les classes partielles) .
Quel est le problème avec votre propre méthode alors? N'utilisez le mien que si vous avez l'option Strict On –
Avez-vous le contrôle de la sous-classe? Si vous le faites, allez avec la solution de Lucero. –
@Michael Haren: C# n'a pas d'option Strict du tout. Ma solution fonctionne si vous n'avez aucun contrôle sur les classes, la solution de Lucero est la meilleure si vous avez le contrôle sur les sous-classes. –