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!
}
}
4 Réponses :
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
Appeler une méthode virtuelle dans un constructeur est une mauvaise idée: msdn.microsoft.com/en-us/library/ms182331 (v = vs.100) .aspx
éventuellement ceci:
Appeler une méthode virtuelle dans un constructeur est une mauvaise idée: msdn.microsoft.com/en-us/library/ms182331 (v = vs.100) .aspx
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;
}
+1, mais ne voulez-vous pas dire que c'est légal d'appeler des méthodes statiques i>?
@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.
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: p> sans helperfonction: p>
Quoi? est
B: A code>? Si oui, comment a des données plus i> 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