Warum ist, wenn ich ein schattiertes Feld in einem Basisklassenkonstruktor festgelegt (unter Verwendung new
Schlüsselwort deklariert) das Feld Shadowed festgelegt wird, aber nicht das Feld Shadowing?Shadowed-Feld wird nicht in Basisklassenkonstruktor
Ich dachte, dass this.GetType()
bezogen auf die äußerste Klasse den ganzen Weg hinunter in Basisklassenaufrufe einschließlich des Konstruktors. Ich dachte auch, dass Shadowing das Schattenfeld nicht zugänglich machte.
In meiner schnellen Wache kann ich zwei Felder sehen, das beschattete, das gesetzt wurde, und das Schattenbild (der Unterklasse), das noch nicht initialisiert ist.
Ich habe es behoben, indem ich das Schattenfeld im Unterklassenkonstruktor explizit gesetzt habe, nachdem es den Basisklassenkonstruktor aufgerufen hat, aber ich würde trotzdem gerne wissen, warum es so funktioniert. .Net Fiddle
using System;
public class Program
{
public static void Main()
{
SubClass subClass = new SubClass(2);
Console.WriteLine(subClass.MyField);
}
}
public class BaseClass
{
public BaseClass(int value)
{
MyField = value; // This doesn't point to SubClass.MyField
}
public int MyField;
}
public class SubClass : BaseClass
{
public SubClass(int value):base(value)
{
}
public new int MyField = 4;
}
aktualisieren
Nach Antworten bewerten, ich sehe ich nicht fragen, was ich in der direkteste Weg, wissen wollte. Entschuldigung für jegliche Unannehmlichkeiten. Hier ist, was ich wirklich wissen möchte:
Ich verstehe Shadowing. Ich stimme damit nicht überein. Ich denke nicht, dass es für Felder erlaubt sein sollte (solange übersteuerbare Felder zu einem Sprachmerkmal gemacht wurden). Ich sehe den Punkt in den Schattenfeldern nicht und habe das schattierte Feld, das herumhängt. Ich sehe jedoch den Punkt in überschreibbaren Feldern und ich verstehe nicht, warum dieses Sprachfeature nicht existiert, wenn es für Eigenschaften und Methoden existiert. Warum also auf Feldern Schatten werfen? Warum gibt es keinen Vorrang vor Feldern?
Es wäre viel einfacher, Ihnen zu helfen, wenn Sie den Code * zeigen * anstatt ihn * zu beschreiben. Grundsätzlich sind Felder nicht polymorph - der Basisklassenkonstruktor kennt nur das Basisklassenfeld und kann nur lesen/schreiben. Ich vermute, das erklärt alles, was du siehst, aber es ist schwer zu sagen, nur aus deiner Beschreibung. –
"Ich dachte auch, dass Shadowing das Schattenfeld nicht existierte." Ich weiß nicht, was du damit meinst oder wo du diese Idee hast. –
@JonSkeet, ok Ich werde etwas Code hinzufügen. Ich meinte, dass das Schattenfeld unzugänglich war, weil es abgelöst wurde; effektiv in der Unterklasse neu deklariert. Ihr Ruf ist 861k; mein Argument ist ungültig :-) – toddmo