7
votes

Problème avec constructeurs et héritage dans C #

J'ai le problème suivant:

public class A {
    public A(X, Y, Z) {
    ...
    }
}

public class B : A {
    public B(X, Y) : base(X, Y) {
        //i want to instantiate Z here and only then pass it to the base class!
    }
}


3 commentaires

Quoi? est B: A ? Si oui, comment a des données plus plus que b? En outre, un ne semble pas avoir un tel constructeur ...


Voulez-vous dire classe publique B: A {dans votre exemple?


Message d'origine édité. Oui, c'est b: un


4 Réponses :


1
votes
public abstract class A {
    public A(X, Y) {
    ...
    }

    public abstract Z TheVariableZ{get;set;}
}

public class B : A {
    public B(X, Y) : base(X, Y) {
        //i can only calculate Z here!
    }

    public override Z TheVariableZ{//implement it here}
}
And if you can't make A abstract, just mark the property as virtual

1 commentaires

Appeler une méthode virtuelle dans un constructeur est une mauvaise idée: msdn.microsoft.com/en-us/library/ms182331 (v = vs.100) .aspx



1
votes

éventuellement ceci: xxx


1 commentaires

Appeler une méthode virtuelle dans un constructeur est une mauvaise idée: msdn.microsoft.com/en-us/library/ms182331 (v = vs.100) .aspx



13
votes

La solution commune consiste à appeler une méthode statique appartenant au type qui peut calculer la valeur du paramètre à transmettre au constructeur de base.

Par exemple: P>

public B(int x, int y)
    : base(x, y, CalculateZ(x, y))
{

}

// You can make this parameterless if it does not depend on X and Y
private static int CalculateZ(int x, int y)
{
   //Calculate it here.

    int exampleZ = x + y;

    return exampleZ;
}


2 commentaires

+1, mais ne voulez-vous pas dire que c'est légal d'appeler des méthodes statiques ?


@Kobi, @Lukeh: était une faute de frappe de gel du cerveau; L'esprit pense une chose et les doigts saisissent un autre. Merci de le pointer.



2
votes

Vous devez calculer Z avant que le constructeur lui-même soit appelé. Si c'est simple, vous pouvez utiliser une expression intégrée, sinon vous devez définir une fonction d'aide.

Utilisation d'une helperfonction: xxx

sans helperfonction: xxx


0 commentaires