IList Interface und TabPageCollection

Hallo,

Laut Doku implementiert die Klasse TabPageCollection das nicht generische Interface IList und definiert jedoch eine Methode
public void Add(String)
Wenn ich nun gleichermaßen versuche IList einzubinden und die Methode Add zu definieren, verlangt der Compiler die Methodendefinition

public int Add(Object)

von mir. Selbst int Add(String) akzeptiert er nicht. Irgendwie stehe ich auf dem Schlauch. Wo liegt mein Denkfehler?

Hi!

Der Denkfehler liegt darin, dass Du annimmst, TabPageCollection würde Add(Object) nicht implementieren, weil Du es nicht siehst, obwohl es Bestandteil von IList ist.
TabPageCollection implementiert Add(Object) sehr wohl, allerdings als private int IList.Add(Object value), darum siehst Du die Methode nicht.
Kennst Du eigentlich schon „Reflector“ von Lutz Roeder? Sehr zu empfehlen, damit kann man auch MS recht gut in die Karten der BCL schauen…

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

danke zunächst für Deine Antwort. Nein, den Reflector kannte ich noch nicht. Mag sein, dass TabPageCollection die Methode als private deklariert, nur wird doch dann die Bedingung des public interface nicht erfüllt.
Genau das meint auch der Compiler, wenn ich ihm eine private Methode Add unterjubeln will. Irgendwo muss es offenbar noch einen Kniff geben.

Nein, versuch’ nicht irgend einen esoterischen Trick zu suchen, den nur Microsoft verwenden kann. Es handelt sich um ganz normale Interfacedeklaration und -implementierung.
IList beinhaltet „void Add(Object value)“, also musst die implementierende Klasse eine Implementierung dafür bereit stellen.
In Interfaces kannst Du eben nicht die Sichtbarkeit jeder Methode angeben und das Weglassen des entsprechenden Modifikators dort bedeutet nicht „Standardsichtbarkeit“ (i.e. internal)!

Wenn Deine Klasse also angibt, dass sie IList implementiert, hat sie schlicht und ergreifend auch irgendeine Implementierung von „void Add(Object value)“ zu liefern, auch wenn diese Methode dann in der konkreten Klasse private ist.
Wenn Du nur eine Methode „void Add(string value)“ lieferst, ist das nicht genug - diese Methode implementiert keine der Interfacemethoden von IList!

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Wenn Deine Klasse also angibt, dass sie IList implementiert,
hat sie schlicht und ergreifend auch irgendeine
Implementierung von „void Add(Object value)“ zu liefern, auch
wenn diese Methode dann in der konkreten Klasse private ist.

Aber genau das bemängelt der Compiler dann wie folgt:
_… implementiert den Schnittstellenmember System.Collections.IList.Add(object) nicht. …Add(object) ist statisch, nicht öffentlich oder hat den falschen Rückgabewert.

Das ganze passiert nicht mehr, sobald ich die Add(object) Methode
als public deklariere.
Zum Schluss existieren bei mir folgenge Varianten:

private int Add(object value);
public int Add(String title);
public int Add(ilookTabPage page);
public int Add(Form wnd, String title);
public int Add(Form wnd, String title, EventHandler closehandler);

Sobald ich das private in public ändere, gibt der Compiler Frieden._

Endlich
Durch Disassemblieren mit dem von Dir erwähnten Reflector habe ich das _Problem gefunden. Es lag demnach schlichtweg an der Syntax der Deklaration.
Wenn ich nun **keinen Modifizierer angebe und Add in Abhängigkeit zu ILIst dann klappt das, also

int IList.Add(object value)

Danke Dir für Deine Tipps und Deine Geduld. Hab wieder was gelernt.

Grüße,
Andreas**_