2017-10-19 51 views
0

Désolé pour le mauvais titre, il est difficile de trouver à affiner exactement ce que ce problème concerne.variable de type coulée automatiquement les appels vers un baseclass dans un séparé baseclass

J'ai deux hiérarchies de classes qui sont essentiellement construites en parallèle: pour chaque sous-type de BaseObject, il y a un sous-type de BaseUIObject. La raison spécifique à cela est parce que BaseObjects sont en fait des objets scriptables (de l'unité), et donc je suis en utilisant un autre ensemble de classes pour représenter chaque instance de l'un de ces objets scriptable.

code Exemple:

public abstract class BaseUIObject { 
     public BaseObject someObject; 

     public void Setup(BaseObject baseObject) 
     { this.baseObject = baseObject; } 
    } 

    public class SomeUIObject : BaseUIObject { 
     public void Setup(SomeObject someObject) 
     { base.Setup(someObject); SomeUIObjectSpecificRoutine(); } 

     private void SomeObjectSpecificRoutine() { 
      someObject.doSubClassFunction(); 
     } 
    } 

Lors du passage l'objet de type SomeObject à la configuration de SomeUIObject, il devient stocké en tant que lieu de BaseObject SomeObject. Existe-t-il un moyen propre d'empêcher que cela se produise?

Maintenant les deux options que j'ai sont soit de définir la variable someObject dans chaque sous-classe de BaseUIObject, soit de lancer explicitement (SomeObject) someObject chaque fois que je l'utilise dans les méthodes de SomeUIObject. Aucune de ces méthodes semblent propres et je me sens comme il doit y avoir un moyen plus agréable d'utiliser l'héritage pour le faire.

Merci pour toute aide.

Répondre

1

On dirait un bon endroit pour Generics me:

public abstract class BaseUIObject<T> where T : BaseObject 
{ 
    public T theObject { get; private set; } 

    public virtual void Setup(T baseObject) 
    { 
     this.theObject = baseObject; 
    } 
} 

Et puis, dans vos objets de l'interface utilisateur en béton:

public class SomeUIObject : BaseUIObject<SomeObject> 
{ 
    public override void Setup(SomeObject someObject) 
    { 
     base.Setup(someObject); 
     SomeUIObjectSpecificRoutine(); 
    } 
    // rest of concrete class code... 
} 
+0

parfait - c'est exactement ce que je suis après, mais avaient pas les connaissances être capable de google pour correctement. Merci pour la réponse rapide, verra si cela fonctionne. – Cerzi

+0

Un problème avec le type T dans la configuration() arg de SomeUIObject - Type/espace de nom ne peut pas être trouvé. je devrais probablement noter que BaseUIObject lui-même hérite d'une autre classe, de sorte que sa définition actuelle est: public abstract class BaseUIObject : OtherBaseClass où T: T BaseObject – Cerzi

+0

type est le type que vous utilisez pour la déclaration de succession. A quoi ressemble votre code maintenant? –