So delegieren Sie die Schnittstellenimplementierung an eine andere Klasse in C #

8

Nehmen Sie die folgende Klasse an:

%Vor%

Es ist notwendig, die IEnumerator-Methoden in MyEnum zu implementieren. Aber ist es möglich, die Implementierung für IEnumerator direkt an _myList zu delegieren oder umzuleiten, ohne die IEnumerator-Methoden implementieren zu müssen?

    
Willem 24.09.2008, 09:14
quelle

7 Antworten

7

Methode 1: Verwenden Sie weiterhin die Kapselung und leiten Sie Aufrufe an die List-Implementierung weiter.

%Vor%

Methode 2: Wenn Sie die List-Implementierung übernehmen, erhalten Sie dieses Verhalten kostenlos.

%Vor%

Methode 1 ermöglicht ein besseres Sandboxing, da es keine Methode gibt, die in List ohne MyEnum-Wissen aufgerufen wird. Für den geringsten Aufwand wird Methode 2 bevorzugt.

    
Jorge Ferreira 24.09.2008, 09:27
quelle
1

Sie können dies tun:

%Vor%

Der Grund ist einfach. Ihre Klasse kann mehrere Felder enthalten, die Sammlungen sind, so dass der Compiler / die Umgebung nicht wissen kann, welches Feld für die Implementierung von "IEnumerator" verwendet werden sollte.

EIDT: Ich stimme @pb zu - Sie sollten IEnumerator & lt; SomeObject & gt; Schnittstelle.

    
TcKs 24.09.2008 09:25
quelle
1

Abgesehen von der Verwendung der Methode von pb ist dies aus einem "einfachen" Grund nicht möglich: Die Interface-Methode muss einen this -Zeiger als erstes Argument übergeben bekommen. Wenn Sie GetEnumerator für Ihr Objekt aufrufen, ist dieser Zeiger Ihr Objekt. Damit der Aufruf an der geschachtelten Liste funktioniert, muss der Zeiger jedoch ein Verweis auf diese Liste und nicht auf Ihre Klasse sein.

Daher müssen Sie die Methode explizit an das andere Objekt delegieren.

(Und übrigens, der Hinweis in der anderen Antwort war richtig: Verwenden Sie IEnumerator<T> , nicht IEnumerable !)

    
Konrad Rudolph 24.09.2008 09:27
quelle
0

Wenn Sie eine Auflistung so zurückgeben möchten, dass der Aufrufer die Auflistung nicht ändern kann, möchten Sie die Liste möglicherweise in eine ReadOnlyCollection & lt; & gt; und gebe IEnumerable & lt; & gt; der ReadOnlyCollection & lt; & gt;.

Auf diese Weise können Sie sicher sein, dass Ihre Sammlung nicht geändert wird.

    
Sam 24.09.2008 09:27
quelle
-1

Nicht, wenn Sie nicht von List & lt; T & gt;.

abgeleitet sind %Vor%     
Paul van Brenk 24.09.2008 09:18
quelle
-1

Vielen Dank für Ihre Anregungen und Anregungen. Irgendwann habe ich einige Ihrer Antworten mit folgenden kombiniert:

%Vor%

Diese Lösung soll sicherstellen, dass der aufrufende Code nicht in der Lage ist, die Liste zu modifizieren, und jeder Aufzähler unabhängig von den anderen in jeder Hinsicht ist (z. B. beim Sortieren). Nochmals vielen Dank.

    
Willem 24.09.2008 09:54
quelle
-1

Beachten Sie, dass Sie dank Duck-Typing % verwenden können. co_de% für jedes Objekt, das eine foreach -Methode hat - der Objekttyp muss nicht wirklich GetEnumerator implementieren.

Also wenn du das tust:

%Vor%

Dann funktioniert das ganz gut:

%Vor%     
yoyo 07.06.2017 20:42
quelle

Tags und Links