Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C# 2 indexer im interface deklarieren. Wie? (https://www.delphipraxis.net/64596-2-indexer-im-interface-deklarieren-wie.html)

Heffalump 5. Mär 2006 20:09


2 indexer im interface deklarieren. Wie?
 
Hallo zusammen,

hat von Euch schon mal einer 2 indexer in einer Schnittstelle deklariert, wobei die Parameterliste "[int index]" ist. Bei mir will es nur funktionieren, wenn die Parameterliste unterschiedlich ist (einmal [int index] und einmal [string index]). Entweder ist der erste Fall nicht zulässig oder ich stelle mich zu intelligent an.

Wie kann eine solches interfaces aussehen?

Dax 5. Mär 2006 20:14

Re: 2 indexer im interface deklarieren. Wie?
 
Zwei Indexer mit selber Signatur? Geht per Definition nicht, weil der Compiler die Dinger dann nicht mehr unterscheiden kann.

Elvis 5. Mär 2006 20:25

Re: 2 indexer im interface deklarieren. Wie?
 
So probiert?
Code:
interface IMiep<T>
{
  T this[int index] {get;}
  T this[string index] {get;}
}
@Dax (string) ist eine andere Signatur as (int)

Dax 5. Mär 2006 20:29

Re: 2 indexer im interface deklarieren. Wie?
 
Heya Elvis

Zitat:

Zitat von Heffalump
Bei mir will es nur funktionieren, wenn die Parameterliste unterschiedlich ist (einmal [int index] und einmal [string index])

Damit ist dein Beispiel gemeint, und es wird gleichzeitig ausgeschlossen ;)

Ich glaub es ist eher sowas wie
Code:
interface IMiep
{
  int this[int index] {get;}
  string this[int index] {get;}
}
gemeint.

Das (string) und (int) unterschiedliche Signaturen sind weiß ich *g*

Heffalump 6. Mär 2006 11:22

Re: 2 indexer im interface deklarieren. Wie?
 
So funktioniert es mit Delphi.NET (Winform)
Delphi-Quellcode:
  IMiep = interface
    function get_Index1(index: integer): string;
    function get_Index2(index: integer): string;

    property Index1[index: integer]: string read get_Index1;
    property Index2[index: integer]: string read get_Index2;
  end;
Wie kann man das Beispiel in C# darstellen?

JasonDX 6. Mär 2006 11:39

Re: 2 indexer im interface deklarieren. Wie?
 
Zitat:

Zitat von Heffalump
Delphi-Quellcode:
  IMiep = interface
    function get_Index1(index: integer): string;
    function get_Index2(index: integer): string;

    property Index1[index: integer]: string read get_Index1;
    property Index2[index: integer]: string read get_Index2;
  end;
Wie kann man das Beispiel in C# darstellen?

Das wird schwer werden. In C# muss eine indizierte Property this heißen. und 2x this mit selber Signatur geht, wie oben schon gesagt, nicht.
Ich frag mich, warum das überhaupt in Delphi.NET geht :gruebel:

greetz
Mike

Dax 6. Mär 2006 11:41

Re: 2 indexer im interface deklarieren. Wie?
 
Ich schätze mal Delphi.NET setzt den Indexer-Zugriff einfach auf nen Call zur get_Index-Methode um, ohne wie C# das macht das DefaultMemberAttribute für die Methode zu setzen.

Elvis 6. Mär 2006 11:59

Re: 2 indexer im interface deklarieren. Wie?
 
Zitat:

Zitat von JasonDX
Das wird schwer werden. In C# muss eine indizierte Property this heißen.

Eigentlich heißt sie Item. Und benannte Indexer zu benutzen ist so eine komische Eigenart aus D32, wenn jemand zu faul ist eine Containerklasse zu schreiben. (Es kommt ja nicht von ungefähr, dass D32 Code ziemlich inkompatibel zu for-in ist ;) )
Zitat:

Ich frag mich, warum das überhaupt in Delphi.NET geht :gruebel:
Es geht schon, aber wie man in Heffalumps Schnipsel sehen kann braucht D.Net immer noch setter für properties in Interfaces, weil es keine virtuellen/abstrakten Properties kann.
In Chrome würde es zum Bleistift so aussehen:
Delphi-Quellcode:
IMiep<T> = interface
  property Item[index : Integer] : String read; default;
  property Item[name : String] : String read; default;
end;
Der generierte IL Code ist exakt der gleiche wie in C#. Wobei Item auch Mööp heißen könnte ohne, dass man es in C# erkennen würde. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz