Wie definieren Sie einen virtuellen abstrakte getter-und setter für eine Eigenschaft?
Dies ist im wesentlichen, was ich tun will:
public abstract class Uniform<T>
{
public readonly int Location;
private T _variable;
public virtual T Variable
{
get { return _variable; }
}
}
public class UniformMatrix4 : Uniform<Matrix4>
{
public override Matrix4 Variable
{
set
{
_variable = value;
GL.UniformMatrix4(Location, false, ref _variable);
}
}
}
Den getter für Variable
werden die gleichen sein in allen abgeleiteten Klassen, aber die Einstellung muss anders werden.
In der Tat... ich würde es vorziehen, nicht zu haben abgeleitete Klassen (und es ist nur eine Funktion aufrufen, unterscheiden sich für jede Art), aber ich kann nicht denken, wie sonst, es zu tun.
Edit: Wenn es war nicht klar, was das problem das ich habe ist, ich bekomme einen syntax-Fehler:
'UniformMatrix4.Variable.set': nicht überschreiben kann, weil 'Uniform.Variable' nicht haben eine überschreibbare set-accessor
Und ich bin mir nicht sicher, wie Sie Sie erstellen eine "überschreibbare set-accessor"... virtual
und abstract
scheint Ihnen nicht erlaubt, auf der setter.
InformationsquelleAutor mpen | 2011-12-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht möglich, in C#, aber als workaround könnten Sie dies tun. Es würde bedeuten, den Aufruf einer abstrakten Set-Funktion, die könnten überschrieben werden, die von abgeleiteten Klassen verwendet werden, während die standard erhalten intakt. Würde das funktionieren?
Interessante Lösung! Und das wäre eine Kraft, die abgeleiteten Klassen zu implementieren, der setter. Nicht ganz so sauber, aber es ist sicherer. Ich mag es!
Wenn Sie das tun, ist
Variable
muss nicht virtuell sein mehr.Ja Mike, du hast Recht, es bestünde ein extra virtual function call. Dies könnte verhindert werden, indem versiegelt überschrieben SetVariable-Funktion. Ich habe auch entfernt die virtuelle von der Unterkunft aus also vielen Dank für den Kommentar, Frank.
Wh00ps, sorry: ja, es ist wahr, dass die Variable nicht virtuellen nicht mehr. Also, nur eine virtuelle Methode aufrufen, so, gleiche Leistung wie meine Lösung. Und besser. +1.
InformationsquelleAutor Dr. ABT
Werden Sie brauchen, um dies zu tun:
Als ich verstehen, das Verhalten wird erwartet.
Hoffe, es hilft.
_variable
solltevalue
wie hast du Sie entfernt, meine Unterstützung hat Mitglied, aber nahe genug! Wusste nicht, dass ich dies tun könnte, ohne eine.Ich fest, dass. Danke!
InformationsquelleAutor Ivo
Ist es nicht möglich diese in C#. Sie haben, um einen setter an der Basis-Klasse, und machen es werfen einer Ausnahme "Ungültiger Vorgang".
NotImplementedException
mehr Sinn macht, aber es scheint zu funktionieren jetzt 😀Tatsächlich, Sie könnten Recht über die Ausnahme; zum Beispiel, dass das, was die ReadOnlyCollection<T> class wirft, wenn Sie versuchen, es zu ändern.
InformationsquelleAutor Mike Nakis