Ich bemerkte in C#, im Gegensatz zu C++, können Sie virtuelle und generische Methoden kombinieren. Zum Beispiel:Leistung der C# -Methode Polymorphismus mit Generika
using System.Diagnostics;
class Base {
public virtual void Concrete() {Debug.WriteLine("base concrete");}
public virtual void Generic<T>() {Debug.WriteLine("base generic");}
}
class Derived : Base {
public override void Concrete() {Debug.WriteLine("derived concrete");}
public override void Generic<T>() {Debug.WriteLine("derived generic");}
}
class App {
static void Main() {
Base x = new Derived();
x.Concrete();
x.Generic<PerformanceCounter>();
}
}
Da ein beliebige Anzahl von Versionen von Generic<T>
instanziert werden könnte, sieht es nicht wie der Standard-vtbl
Ansatz verwendet werden könnte, Methodenaufrufe zu lösen, und in der Tat ist es nicht. Hier ist der generierte Code:
x.Concrete();
mov ecx,dword ptr [ebp-8]
mov eax,dword ptr [ecx]
call dword ptr [eax+38h]
x.Generic<PerformanceCounter>();
push 989A38h
mov ecx,dword ptr [ebp-8]
mov edx,989914h
call 76A874F1
mov dword ptr [ebp-4],eax
mov ecx,dword ptr [ebp-8]
call dword ptr [ebp-4]
Der zusätzliche Code erscheint eine dynamische vtbl nach den allgemeinen Parametern zu suchen, und dann hinein ruft. Hat jemand über die Besonderheiten dieser Implementierung geschrieben? Wie gut funktioniert es im Vergleich zum nicht-generischen Fall?
Genau das, was ich gesucht habe, danke! – zildjohn01