Ich muss eine Schnittstelle definieren, die bestimmte Überlastung des Operators auf die Typen erzwingen muss, die sie implementieren. Es scheint keinen offensichtlichen Weg dafür zu geben, da das Überladen von Operatoren mit statischen Methoden in der Klasse durchgeführt werden muss. Gibt es eine Möglichkeit, den gleichen Effekt zu erzielen (mit abstrakten Klassen oder irgendetwas anderem)?Gibt es in C# eine Möglichkeit, das Überladen von Operatoren in abgeleiteten Klassen zu erzwingen?
Gibt es in C# eine Möglichkeit, das Überladen von Operatoren in abgeleiteten Klassen zu erzwingen?
Antwort
bisschen wie ein Hack, aber ...
Sie könnten Betreiber Überlastungen in Ihrer Basisklasse zur Verfügung stellen, die dann einige der Klassen in einer abstrakten Methoden veröffentlicht nennen es die Arbeit zu erledigen.
public abstract class MyClass
{
public static MyClass operator +(MyClass c1, MyClass c2)
{
return c1.__DoAddition(c2);
}
protected abstract MyClass __DoAddition(MyClass c2);
}
Nein. Der einzig sinnvolle Weg wäre, eine Unit-Test-Prüfung zu verwenden, um alle konkreten Implementierungen zu finden und diese Bedingung zu überprüfen. Sie könnten auch vielleicht etwas zur Laufzeit re dasselbe über einen statischen Konstruktor, aber dann ist die Frage welche statischen Konstruktor?
Ein anderer Ansatz besteht darin, die Operatoren zu löschen und einen interface-basierten Ansatz zu verwenden; Wenn Sie zum Beispiel T
benötigen, um +(T,T)
zu haben, haben Sie anstelle von Operatoren eine Schnittstelle mit einer Add(T)
Methode. Ein weiterer Vorteil ist, dass Schnittstellen aus Generika (typischerweise über Constraints) nutzbar sind, wobei die Verwendung von Operatoren aus generischem Code etwas Aufwand erfordert.
Mit Methoden wie addieren, subtrahieren nächste offensichtliche Wahl ist, aber da mein Code wird viele Berechnungen haben wie 's = s1 * 2 + s2 * s3 - s4 * (s5 - s6);'. Durch die Verwendung von Methoden wird es "s = s1.Multiply (2) .Add (s2.Multiply (s3)). Subtrahieren (s4.Multiply (s5.Subtract (s6)));' Sicher nicht sehr lesbar! – Hemant
@Hemant: Sie können Apostroph 'verwenden, um Code in Kommentare zu markieren – abatishchev
@abatishchev behoben, dass; p –
Sie könnten das Überladen in einer abstrakten Basisklasse implementieren, aber die tatsächlichen Vorgangsmerkmale an eine abstrakte Methode delegieren. Dann muss dies implementiert werden und das Überladen wird mit ihrer Implementierung verhindert.
public abstract class OverLoadingBase
{
public abstract OverLoadingBase DoAdd(OverLoadingBase y);
public static OverLoadingBase operator +(OverLoadingBase x, OverLoadingBase y)
{
return x.DoAdd(y);
}
}
Obwohl ich nicht sicher bin, ob das vollständig ist.
@abatishchev - Ich bin neugierig - warum das Klammerformat ändern? –
Da sein Operator nur überlastet werden kann und nicht übersteuert ist es ziemlich schwierig. Die beste Lösung, die ich mir vorstellen kann, ist eine abstrakte Klasse zu verwenden und so zu überladen.
public abstract class MyBase
{
public abstract MyBase Add(MyBase right);
public abstract MyBase Subtract(MyBase right);
public static MyBase operator +(MyBase x, MyBase y)
{
//validation here
return x.Add(y);
}
public static MyBase operator -(MyBase x, MyBase y)
{
//validation here
return x.Subtract(y);
}
}
ich dies in der Vergangenheit getan haben ...
public abstract class BaseClass<TClass> where TClass : BaseClass
{
public static TClass operator +(TClass c1, TClass c2)
{
return c1.DoAddition(c2);
}
protected abstract TClass DoAddition(TClass c2);
}
Und dann wie folgt umgesetzt:
public class ConcreteClass : BaseClass<ConcreteClass>
{
protected ConcreteClass DoAddition(ConcreteClass c2)
{
...
}
}
- 1. Operatoren überladen in C++
- 2. C++ Zuweisungsoperator = Überladen mit abgeleiteten Klassen
- 3. C#: Gibt es eine Möglichkeit, eine Tooltip zu erzwingen?
- 4. Gibt es eine Möglichkeit, + = in Python zu überladen?
- 5. Ist es möglich, Operatoren in C zu überladen?
- 6. C# String Überladen von Operatoren
- 7. Gibt es eine Möglichkeit, das Standardverhalten von Klammern zu überschreiben?
- 8. Gibt es eine Möglichkeit, eine DLL-Version zu erzwingen?
- 9. Gibt es eine Möglichkeit, das WorkingSet eines Prozesses 1 GB in C++ zu erzwingen?
- 10. Überladen von Operatoren für Objekte in mehreren Klassen
- 11. Grund für das Erzwingen einiger Operatoren, Mitglieder zu sein
- 12. Gibt es eine Möglichkeit, verschachtelte Klassen in C++ vorzudefinieren?
- 13. Gibt es eine Möglichkeit, Hosts in Go zu erzwingen?
- 14. C++: Vererbung und Überladen von Operatoren
- 15. Gibt es eine Möglichkeit, MySQL Ausführungsreihenfolge zu erzwingen?
- 16. Gibt es eine Möglichkeit, Tabulatoren anstelle von Leerzeichen zu erzwingen?
- 17. Wie erzwingen, dass Basisklassenkonstruktoren in abgeleiteten Klassen aufgerufen werden?
- 18. Erzwingen der Implementierung von Ereignissen in abgeleiteten abstrakten Klassen
- 19. Gibt es eine Möglichkeit, TypeScript-Klassen in Closures zu erstellen?
- 20. Überladen von C++ Operatoren int/float (..)
- 21. Gibt es eine Möglichkeit, den Regex-Bindeoperator `= ~` in Perl zu überladen?
- 22. Gibt es eine Möglichkeit, Update-Tabellen Metadaten zu erzwingen?
- 23. Verwirrung von Überladen von Operatoren in Java
- 24. Gibt es eine bessere Möglichkeit, das Überladen von Eigenschaften zu blockieren?
- 25. Überladen von Operatoren, muß eine Erklärung
- 26. Gibt es eine Möglichkeit, WMI-Code/Klassen zu generieren?
- 27. Überladen von Operatoren in C++ als int + obj
- 28. Gibt es eine Möglichkeit, Mixins auf kompatible Klassen zu beschränken?
- 29. Gibt es eine Möglichkeit, algebraische Typen in Java zu implementieren?
- 30. Gibt es eine einfache Möglichkeit, C# -Klassen in PHP zu konvertieren?
'geschützter abstrakter' anstelle 'privater abstrakter', ich denke. – abatishchev
Nicht nett, aber wirkungsvoll. Ich mache es auch so. – elsni
@abatishchev: whoops, danke :) – Codesleuth