web-dev-qa-db-fra.com

Comment obtenir une instance de classe de base à partir d'une classe dérivée

Je ne sais pas si cela est possible, mais j'essaie d'obtenir l'instance de classe de base à partir d'une classe dérivée. En C #, je peux utiliser le mot clé base pour accéder aux propriétés et aux méthodes de la classe de base (bien sûr), mais je souhaite utiliser base lui-même. Tenter de le faire aboutit à un "L'utilisation du mot clé 'base' n'est pas valide dans ce contexte" error.

Exemple de code

public class SuperParent
{
    public int SPID;

    public SuperParent()
    {
    }
}

public class SubChild : SuperParent
{
    public SubChild(int pSPID)
    {
        base.SPID = pSPID;
    }

    public int BaseSPID
    {
        get
        {
            SuperParent sp = base;
            return sp.SPID;
        }
    }
}
10
OneSource

Si vous travaillez avec une instance de la classe dérivée, il n'y a pas base instance. Un exemple:

class A
{
    public void Foo() { ... }
}

class B : A
{
    public void Bar() { ... }
}

Ce qui n’est pas possible dans B:

public void Bar()
{
    // Use of keyword base not valid in this context
    var baseOfThis = base; 
}

Vous pouvez faire quelque chose comme ça:

public void Bar()
{
    base.Foo();
}

Et vous pouvez ajouter une autre méthode comme 

public A GetBase()
{
    return (A)this;
}

Et alors tu peux

public void Bar()
{ 
    var baseOfThis = GetBase();
    // equal to:
    baseOfThis = (A)this;
}

Donc, cette méthode GetBase() est probablement ce que vous voulez.

La limite est la suivante: Si vous avez une instance de B, elle hérite de toutes les propriétés et du comportement non surchargé de A, mais elle ne consiste pas en une instance de B qui contient une référence (masquée mais automatique) à une instance de A. Vous pouvez convertir votre instance B en A, mais il doit rester une instance de B.

14
Matten

Eh bien, vous ne fournissez pas de code pour votre question, mais je suppose que vous voulez quelque chose comme

class Base
{
    public virtual void Foo()
    {
        Console.WriteLine("base");
    }
}

class Derived : Base
{
    public override void Foo()
    {
        Console.WriteLine("derived");
    }

    //// bad
    //public Base MyBase
    //{
    //    get
    //    {
    //        return base; // Use of keyword 'base' is not valid in this context
    //    }
    //}

    // work but...
    public Base MyBase
    {
        get
        {
            return (Base)this;
        }
    }
}

Mais gardez à l’esprit que MyBase est vraiment du type Derived

new Derived().MyBase.Foo(); // output "derived"
3

Point 1: si vous voulez créer l'instance de classe de base dans la classe enfant, cela ne vaut pas la peine. Vous avez déjà des choses publiques accessibles en enfant. 

Point 2: Si vous avez initialisé la classe enfant et souhaitez maintenant obtenir une instance de classe de base, comment pouvez-vous l'obtenir si elle n'est pas initialisée (car l'instance de la classe de base n'est pas présente dans la mémoire physique et qu'il n'y a qu'une classe enfant) exemple là-bas)?

0
ataurrehman
 class Parent
 {
      private Parent _parent;
      public Parent()
      {
         _parent = this;
      }

     protected Parent GetParent()
     {
         return _parent;
     }
 }

class Child : Parent
{
    private Parent _parent;
    public Child()
    {
        _parent = base.GetParent();
    }
}
0
Subin Ninan

le problème n'a pas été expliqué aussi clairement que possible. Cependant, il est généralement préférable d'utiliser une classe de base abstraite et des méthodes, puis de remplacer les méthodes requises. vous pouvez ensuite utiliser la méthode base.method comme requis dans ce cas (sinon, vous venez de créer une instance de la classe dérivée).

public abstract class foo {

   public virtual void bar(){..}
}

public class footwo : foo {
   public override void bar(){
       // do somethng else OR:
       return base.bar();
   }
}

}

0
jim tollan

J'ai interprété ce qu'ils demandaient un peu différemment des autres réponses ici, alors j'ai pensé offrir mon 0,02 $.

// Create a "Parent" class that has some attributes.
public class Parent
{
    public string attribute_one { get; set; }
    public string attribute_two { get; set; }
    public string attribute_three { get; set; }
}

// Define a class called "Child" that inherits the
// attributes of the "Parent" class.
public class Child : Parent
{
    public string attribute_four { get; set; }
    public string attribute_five { get; set; }
    public string attribute_six { get; set; }
}

// Create a new instance of the "Child" class with
// all attributes of the base and derived classes.
Child child = new Child {
    attribute_one = "interesting";
    attribute_two = "strings";
    attribute_three = "to";
    attribute_four = "put";
    attribute_five = "all";
    attribute_six = "together";
};

// Create an instance of the base class that we will
// populate with the derived class attributes.
Parent parent = new Parent();

// Using reflection we are able to get the attributes
// of the base class from the existing derived class.
foreach(PropertyInfo property in child.GetType().BaseType.GetProperties())
{
    // Set the values in the base class using the ones
    // that were set in the derived class above.
    property.SetValue(parent, property.GetValue(child));
}

Le résultat est un nouvel objet rempli avec les propriétés de la classe de base de la classe enfant.

0
BBQ Singular

L'instance dérivée IS l'instance de base. C'est juste une instance d'objet en mémoire.

exemple:

public class A : B 
{
}

var thing = new A();

thing est une instance de A et est également une instance de B
Vous pouvez par exemple écrire cette ligne: 
B thing2 = thing;

0
Caleb