using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new B("MyName").Name);
}
}
abstract class A
{
public A(string name)
{
this.GetType().GetField("Name").SetValue(this, name);
}
}
class B : A
{
public B(string name)
: base(name)
{
}
public string Name
{
set;
get;
}
}
}
Est-il possible de faire quelque chose comme ça?Définition de la valeur d'un champ de la classe dérivée
+1. Vous dites exactement ce que j'ai pensé en lisant la question. Mais je pense toujours que ce n'est pas aussi facile que ça. CA se plaindra parce que vous exécutez du code dans la classe dérivée avant l'initialisation de la classe de base (vous êtes toujours dans le constructeur de A lorsque vous appelez le setter abstrait). Bien sûr, vous pouvez le supprimer tant que vous affectez simplement la valeur au champ. –
@Stefan: Il est vrai qu'il est possible d'avoir un comportement inattendu si vous ne faites pas attention. Je pense que le vrai problème se produit lors de l'implémentation du même scénario dans VB.NET, qui a un ordre de priorité impair. En C#, l'ordre dans lequel les initialiseurs, les constructeurs et les méthodes surchargées sont appelés est au moins logique, et peut être utile s'il est utilisé correctement. Dans VB.NET, c'est un peu étrange et imprévisible, d'où le problème. Mais cela ne se produit que si vous ECRIVEZ le code dans VB.NET. Si vous compilez le code en C# et l'utilisez dans VB.NET, il maintient l'ordre que C# exécute. – jrista
Vous devez faire face au problème dans C#. Lorsque vous implémentez une classe héritée C qui remplace le nom abstrait, vous accédez à l'une des propriétés ou champs de la classe de base dans le setter du nom. Ce champ n'est pas encore initialisé, vous êtes toujours dans le constructeur de la classe de base quand il est appelé. Cela pourrait être une très mauvaise chose, donc l'analyse du code se plaint à ce sujet. –