Ich habe diese Basisklasse:
abstract class Base
{
public int x
{
get { throw new NotImplementedException(); }
}
}
Und der folgende Nachkomme:
class Derived : Base
{
public int x
{
get { //Actual Implementaion }
}
}
Wenn ich kompiliere, erhalte ich die Warnung, dass die Definition der abgeleiteten Klasse x
die Version von Base verbergen wird. Ist es möglich, Eigenschaften in c # -ähnlichen Methoden zu überschreiben?
c#
inheritance
properties
polymorphism
overriding
atoMerz
quelle
quelle
Ändern Sie die Eigenschaftssignatur wie unten gezeigt:
Basisklasse
public virtual int x { get { /* throw here*/ } }
Abgeleitete Klasse
public override int x { get { /*overriden logic*/ } }
Wenn Sie keine Implementierung in der Basisklasse benötigen, verwenden Sie einfach die abstrakte Eigenschaft.
Base:
public abstract int x { get; }
Abgeleitet:
public override int x { ... }
Ich würde vorschlagen, dass Sie die
abstract
Eigenschaft verwenden, anstatt die NotImplemented-Ausnahme in getter auszulösen. Derabstact
Modifikator zwingt alle abgeleiteten Klassen, diese Eigenschaft zu implementieren, sodass Sie eine sichere Lösung zur Kompilierungszeit erhalten.quelle
abstract class Base { // use abstract keyword public virtual int x { get { throw new NotImplementedException(); } } }
quelle
abstract class Base { public virtual int x { get { throw new NotImplementedException(); } } }
oder
abstract class Base { // use abstract keyword public abstract int x { get; } }
In beiden Fällen müssen Sie in die abgeleitete Klasse schreiben
public override int x { get { your code here... } }
Der Unterschied zwischen den beiden besteht darin, dass Sie mit abstract die abgeleitete Klasse zwingen, etwas zu implementieren, und mit virtaul können Sie ein Standardverhalten bereitstellen, das der Ableiter unverändert verwenden oder ändern kann.
quelle