Comment dois-je appeler une sous-classe de la méthode sur un baseclass objet?

Je suis en utilisant une bibliothèque qui génère un tas de classes pour moi.

Ces classes héritent d'une classe de base commune, mais que la classe de base n'est pas de définir un couple de méthodes qui sont communs à tous 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 génial:

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!
}

Puisqu'il y a une classe de base commune pour mon A+B objets et une classe de base commune pour l'Article objets, j'avais espéré profiter du merveilleux monde de polymorphisme.

Malheureusement, depuis les méthodes courantes ne sont pas réellement présentes dans la classe de base, je ne peux pas les appeler pratiquement. 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

Évidemment l'incantation travail, mais alors j'aurais besoin de savoir quel type j'ai eu qui annulerait les avantages.

Comment puis-je "force" un appel à ces méthodes? Je ne suis pas inquiet à propos de l'obtention d'un objet qui n'implémente pas la méthode que je suis en train de l'appeler. Je peux vraiment faire ce que je veux en VB--je n'ai pas intellisense mais le compilateur est heureux et ça fonctionne:

CType(Obj, Object).Add(Item) //Note: I'm using C#--NOT VB

Contre, je n'ai aucun contrôle sur ces classes (qui, je pense, les règles des classes partielles).

Ce qui est erroné avec votre propre méthode alors? Seule l'utilisation de mines, si vous avez l'Option Strict Sur
Vous avez le contrôle sur la sous-classe? Si vous le faites, aller avec Lucero de la solution.
Haren: C# n'a pas l'Option Strict à tous. Ma solution fonctionne si vous n'avez aucun contrôle sur les classes, Lucero la solution est préférable si vous avez le contrôle sur les sous-classes.

OriginalL'auteur Michael Haren | 2009-04-16