C # abstrakte Struktur

8

Wie kann ich Vererbung (oder ähnliches) mit Strukturen in C # erreichen? Ich weiß, dass eine abstrakte Struktur nicht möglich ist, aber ich muss etwas Ähnliches erreichen.

Ich brauche es als Struktur, weil es ein Werttyp sein muss. Und ich brauche Vererbung, weil ich ein generisches Array brauche und Methoden, die ich garantieren kann, sind da.

Ich denke, dass ein Beispiel einen langen Weg zurücklegen wird, also Code, der nicht kompiliert wird, aber zeigt, was ich erreichen möchte;

%Vor%

BEARBEITEN:

Der Grund, warum ich Werttypen brauche, ist, dass ich ein Array von ihnen erstellen kann, und es an OpenGL als Vertex-Puffer übergeben kann. Dazu müssen die Daten direkt in diesem Array enthalten sein.

Ich wäre überrascht, wenn das nicht möglich wäre.

    
Hannesh 15.02.2011, 18:36
quelle

9 Antworten

5
___ antwort5008838 ___

Im Lichte Ihrer letzten Bearbeitung:

  

Der Grund, warum ich Werttypen brauche, ist, dass ich ein Array von ihnen erstellen kann und sie als Vertex-Puffer an OpenGL übergeben kann. Dazu müssen die Daten direkt in diesem Array enthalten sein.

Es scheint, als ob die echte Lösung für Sie die Kapselung ist. Wenn das Layout Ihrer struct von einer API eines Drittanbieters diktiert wird (sodass Sie mit nicht verwaltetem Code interagieren können), sollten Sie die API-Typen in geeignete Klassen einbetten, anstatt direkt mit ihnen im Code zu interagieren.

Zum einen geben Sie Folgendes an:

  

Ich brauche es als Struktur, weil es ein Werttyp sein muss. Und ich brauche Vererbung, weil ich ein generisches Array brauche und Methoden, die ich garantieren kann, sind da.

Dies wird nicht so aussehen, wie Sie es erwarten. Wie andere bereits festgestellt haben, besteht die einzige Möglichkeit, eine Gruppe allgemeiner Funktionen zu definieren, die für Strukturen gelten kann, über Schnittstellen (z. B. die primitiven Typen in der .NET-Implementierung IComparable ). Wenn Sie ein Array vom Typ IYourInterface deklarieren möchten, werden leider alle Werte eingerahmt (Schnittstellenreferenzen sind Referenztypen, selbst wenn der zugrunde liegende Wert Werttypen ist).

Nehmen wir beispielsweise an, Sie deklarieren eine IVertex Schnittstelle:

%Vor%

Und Sie haben einen oder mehrere Werttypen, die es implementieren:

%Vor%

Wann immer Sie das tun:

%Vor%

Die zweite Zeile wird den Wert von myVertex enthalten und einen Verweis auf diesen umrahmten Wert in foo speichern. Da Arrays nur eine Reihe von Variablen sind, gelten dieselben Regeln:

%Vor%

Alle Werte in foos werden eingerahmt und ihre Referenzen gespeichert. Das ist anders als bei Ihnen:

%Vor%

Wo kein Boxen nötig ist.

Das hat Implikationen, die sich direkt auf das beziehen, was Sie suchen, weil das Boxen der Werte bedeutet, dass Sie keinen zusammenhängenden Werteblock mehr haben (gut, aber der zusammenhängende -Block ist einfach Referenzen; die Werte selbst liegen woanders).

Kapselung

Angesichts der Tatsache, dass Sie

  1. Verfügen Sie über eine API eines Drittanbieters mit einem definierten Typ, mit dem Sie interagieren müssen
  2. Die Anforderung, verschiedene Anwendungsfälle in Ihrem Code zu unterstützen und hierzu objektorientierte Entwurfsmuster zu verwenden

Sie sollten wirklich erwägen, die OpenGL-API zu verpacken. Angenommen, Sie haben Folgendes:

%Vor%

Was wahrscheinlich eine bessere Option wäre, wäre Ihre eigene Schnittstelle zu definieren und dann die OpenGL API zu verstecken:

%Vor%

(Dies ist offensichtlich ein künstliches Beispiel, aber es sollte zeigen, was ich zu vermitteln versuche, um eine Abstraktionsebene zwischen Ihrem Code und der anderen API einzuführen)

    
___ answer5007963 ___

Das geht grundsätzlich nicht. Sie können nicht von einer Struktur ableiten. Warum denkst du, willst du eine Struktur anstelle einer Klasse? Sie sagen "es muss ein Werttyp sein" - warum? Glauben Sie auch, dass die Vererbung die einzige Option ist, und nicht etwa die Zusammensetzung? Zum Beispiel könnten Sie verwenden:

%Vor%

Sie werden einfach nicht in der Lage sein, eine "abstrakte Struktur" oder etwas Ähnliches zu erhalten, daher schlage ich vor, dass Sie die Gründe hinter Ihren unerfüllbaren Anforderungen erläutern , anstatt sie nur als Anforderungen zu bezeichnen, die nicht vermieden werden können.

    
___ answer5008011 ___

Sie können Schnittstellen verwenden

%Vor%     
___ answer5007969 ___

In C # können Sie Interfaces verwenden, um mit Werttypen (Structs) etwas zu erreichen, das Polymorphismus ist, da Sie nicht direkt von %code% ableiten können, aber Sie können mehrere %code% -Typen spezifische Interfaces implementieren lassen.

Daher können Sie statt Ihrer Zusammenfassung %code% , %code% eine Schnittstelle haben, %code% .

%Vor%

Es ist jedoch äußerst selten, dass Sie eigene Werttypen implementieren müssen. Stellen Sie daher vor dem Fortfahren sicher, dass Sie eine Werttyp-Semantik benötigen. Wenn Sie eigene Werttypen implementieren, stellen Sie sicher, dass sie unveränderlich sind, da veränderbare Werttypen ein Gateway für alle Arten von schrecklichen Problemen sind.

Sie sollten sich darüber im Klaren sein, dass Boxen beim Casting auftreten ein Werttyp für eine Schnittstelle. Dies hat nicht nur Auswirkungen, wenn Ihre Wertetypen änderbar sind (machen Sie keine veränderbaren Werttypen), sondern verringert oder hebt höchstwahrscheinlich jeden Speichervorteil auf, den Sie durch die Verwendung eines Wertetyps je nachdem, wann oder wie Sie erhalten Tun Sie dies und ob Sie es für jeden Wert tun - verwenden Sie einen Profiler, wenn Sie sich nicht sicher sind.

    
___ answer12786180 ___

Eine unterschätzte Eigenschaft von Werttypen in .net ist, dass sie als generische Typen mit Schnittstellenbeschränkung übergeben werden können, ohne zu boxen. Zum Beispiel:

%Vor%

Beachten Sie, dass ich %code% -Parameter verwendet habe, um zusätzliche temporäre Kopien der beiden Parameter zu vermeiden; Eine zusätzliche Kopie von %code% wird am Ende erstellt, wenn sie an die %code% -Methode übergeben wird, und mindestens eine zusätzliche Kopie wird wahrscheinlich gemacht, wenn das Ergebnis zurückgegeben wird, aber zwei redundante Kopien herzustellen wäre besser als vier . In jedem Fall kann die oben genannte Methode aufgerufen werden, ohne einen beliebigen Typ %code% einzubetten, der %code% implementiert.

Leider gibt es keine besonders schöne Art zu sagen "wenn %code% ein Typ von Struktur ist, übergebe es an eine Methode, die diesen Typ annimmt; andernfalls, wenn es ein anderer Typ ist, übergib es an eine Methode und nimm diese" . Daher wird Code, der eine bestimmte exakte Klasse erfordert (wie der Code, der die API verwendet), wahrscheinlich nicht-generisch sein. Wenn es jedoch einige Methoden gibt, die auf einer Vielzahl von Strukturen verwendet werden können, kann das Bereitstellen dieser Schnittstellen die Implementierung von Schnittstellen und deren Übergabe als eingeschränkte generische Typen einige große Vorteile bieten.

    
___ answer5008006 ___

Es sieht so aus, als ob Sie eine Schnittstelle wünschen.

%Vor%

Eine Schnittstelle ist sinnvoll, da alle Ihre Methoden als abstrakt deklariert sind (dies würde bedeuten, dass Klassen abgeleitet werden müssen, um die Methode zu implementieren, die im Wesentlichen eine Schnittstelle ist)

    
___ antwort5007999 ___

Sie können Interface IVertex erstellen und dann zu Ihren Strukturen hinzufügen.

    
___ answer5008780 ___

Vielleicht können Sie einen "union" -Typ verwenden:

%Vor%

Denken Sie daran, es unveränderlich zu machen und nur auf die Felder zuzugreifen, die für jeden Typ Sinn ergeben.

    
___ tag123oop ___ Objektorientierte Programmierung ist ein Programmierparadigma, das "Objekte" verwendet: Datenstrukturen, die aus Datenfeldern und Methoden zusammen mit ihren Interaktionen bestehen. ___ tag123inheritance ___ Vererbung ist das System in der objektorientierten Programmierung, das es Objekten ermöglicht, Operationen zu unterstützen, die von anterioren Typen definiert sind, ohne eine eigene Definition angeben zu müssen. Es ist der Hauptvektor für Polymorphie in der objektorientierten Programmierung. ___ answer5007990 ___

Klassen können auch " Werttypen " sein (im Sinne von "Domain Driven Design"). Alles, was Sie tun müssen, ist, es unveränderlich zu machen, die Konstruktoren öffentlich zugänglich zu machen (Geschützt oder intern) und statische Factory-Methoden zu erstellen, um Instanzen von ihnen zu erstellen und deren Instanziierung zu steuern, und keine Setter für Ihre Eigenschaften haben ...

HINWEIS: Der Ausdruck Werttyp in diesem Kontext hat nichts mit Werttyp vs. Referenztyp zu tun. Es hat mit Werttyp vs Entitätstyp zu tun, wie in Domain Drtiven Design oder Domain Modeling verwendet ...

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123struct ___ Ein Schlüsselwort in verschiedenen Programmiersprachen, deren Syntax C ähnelt oder von C abgeleitet ist (C ++, C #, Swift, Go usw.). Verwenden Sie ein spezielles Programmiersprachen-Tag, um Fragen zu markieren, die die Verwendung einer 'struct' als Syntax beinhalten, und Semantik kann sprachabhängig sein. Schlüsselwort definiert oder deklariert einen Datentyp, der aus anderen Datentypen besteht. Jedes Mitglied einer Struktur hat seinen eigenen Speicherbereich (im Gegensatz zu einer "Union", deren Mitglieder einen einzigen Speicherbereich teilen). ___ qstnhdr ___ C # abstrakte Struktur ___ qstntxt ___

Wie kann ich Vererbung (oder ähnliches) mit Strukturen in C # erreichen? Ich weiß, dass eine abstrakte Struktur nicht möglich ist, aber ich muss etwas Ähnliches erreichen.

Ich brauche es als Struktur, weil es ein Werttyp sein muss. Und ich brauche Vererbung, weil ich ein generisches Array brauche und Methoden, die ich garantieren kann, sind da.

Ich denke, dass ein Beispiel einen langen Weg zurücklegen wird, also Code, der nicht kompiliert wird, aber zeigt, was ich erreichen möchte;

%Vor%

BEARBEITEN:

Der Grund, warum ich Werttypen brauche, ist, dass ich ein Array von ihnen erstellen kann, und es an OpenGL als Vertex-Puffer übergeben kann. Dazu müssen die Daten direkt in diesem Array enthalten sein.

Ich wäre überrascht, wenn das nicht möglich wäre.

    
___
Adam Robinson 15.02.2011, 19:59
quelle
7

In C # können Sie Interfaces verwenden, um mit Werttypen (Structs) etwas zu erreichen, das Polymorphismus ist, da Sie nicht direkt von struct ableiten können, aber Sie können mehrere struct -Typen spezifische Interfaces implementieren lassen.

Daher können Sie statt Ihrer Zusammenfassung struct , Vertex eine Schnittstelle haben, IVertex .

%Vor%

Es ist jedoch äußerst selten, dass Sie eigene Werttypen implementieren müssen. Stellen Sie daher vor dem Fortfahren sicher, dass Sie eine Werttyp-Semantik benötigen. Wenn Sie eigene Werttypen implementieren, stellen Sie sicher, dass sie unveränderlich sind, da veränderbare Werttypen ein Gateway für alle Arten von schrecklichen Problemen sind.

Sie sollten sich darüber im Klaren sein, dass Boxen beim Casting auftreten ein Werttyp für eine Schnittstelle. Dies hat nicht nur Auswirkungen, wenn Ihre Wertetypen änderbar sind (machen Sie keine veränderbaren Werttypen), sondern verringert oder hebt höchstwahrscheinlich jeden Speichervorteil auf, den Sie durch die Verwendung eines Wertetyps je nachdem, wann oder wie Sie erhalten Tun Sie dies und ob Sie es für jeden Wert tun - verwenden Sie einen Profiler, wenn Sie sich nicht sicher sind.

    
Jeff Yates 15.02.2011 18:37
quelle
6

Das geht grundsätzlich nicht. Sie können nicht von einer Struktur ableiten. Warum denkst du, willst du eine Struktur anstelle einer Klasse? Sie sagen "es muss ein Werttyp sein" - warum? Glauben Sie auch, dass die Vererbung die einzige Option ist, und nicht etwa die Zusammensetzung? Zum Beispiel könnten Sie verwenden:

%Vor%

Sie werden einfach nicht in der Lage sein, eine "abstrakte Struktur" oder etwas Ähnliches zu erhalten, daher schlage ich vor, dass Sie die Gründe hinter Ihren unerfüllbaren Anforderungen erläutern , anstatt sie nur als Anforderungen zu bezeichnen, die nicht vermieden werden können.

    
Jon Skeet 15.02.2011 18:37
quelle
4

Eine unterschätzte Eigenschaft von Werttypen in .net ist, dass sie als generische Typen mit Schnittstellenbeschränkung übergeben werden können, ohne zu boxen. Zum Beispiel:

%Vor%

Beachten Sie, dass ich ref -Parameter verwendet habe, um zusätzliche temporäre Kopien der beiden Parameter zu vermeiden; Eine zusätzliche Kopie von p2 wird am Ende erstellt, wenn sie an die CompareTo -Methode übergeben wird, und mindestens eine zusätzliche Kopie wird wahrscheinlich gemacht, wenn das Ergebnis zurückgegeben wird, aber zwei redundante Kopien herzustellen wäre besser als vier . In jedem Fall kann die oben genannte Methode aufgerufen werden, ohne einen beliebigen Typ T einzubetten, der IComparable<T> implementiert.

Leider gibt es keine besonders schöne Art zu sagen "wenn T ein Typ von Struktur ist, übergebe es an eine Methode, die diesen Typ annimmt; andernfalls, wenn es ein anderer Typ ist, übergib es an eine Methode und nimm diese" . Daher wird Code, der eine bestimmte exakte Klasse erfordert (wie der Code, der die API verwendet), wahrscheinlich nicht-generisch sein. Wenn es jedoch einige Methoden gibt, die auf einer Vielzahl von Strukturen verwendet werden können, kann das Bereitstellen dieser Schnittstellen die Implementierung von Schnittstellen und deren Übergabe als eingeschränkte generische Typen einige große Vorteile bieten.

    
supercat 08.10.2012 17:02
quelle
2

Sie können Schnittstellen verwenden

%Vor%     
ja72 15.02.2011 18:41
quelle
2

Es sieht so aus, als ob Sie eine Schnittstelle wünschen.

%Vor%

Eine Schnittstelle ist sinnvoll, da alle Ihre Methoden als abstrakt deklariert sind (dies würde bedeuten, dass Klassen abgeleitet werden müssen, um die Methode zu implementieren, die im Wesentlichen eine Schnittstelle ist)

    
Marlon 15.02.2011 18:40
quelle
1
___ antwort5008838 ___

Im Lichte Ihrer letzten Bearbeitung:

  

Der Grund, warum ich Werttypen brauche, ist, dass ich ein Array von ihnen erstellen kann und sie als Vertex-Puffer an OpenGL übergeben kann. Dazu müssen die Daten direkt in diesem Array enthalten sein.

Es scheint, als ob die echte Lösung für Sie die Kapselung ist. Wenn das Layout Ihrer %code% von einer API eines Drittanbieters diktiert wird (sodass Sie mit nicht verwaltetem Code interagieren können), sollten Sie die API-Typen in geeignete Klassen einbetten, anstatt direkt mit ihnen im Code zu interagieren.

Zum einen geben Sie Folgendes an:

  

Ich brauche es als Struktur, weil es ein Werttyp sein muss. Und ich brauche Vererbung, weil ich ein generisches Array brauche und Methoden, die ich garantieren kann, sind da.

Dies wird nicht so aussehen, wie Sie es erwarten. Wie andere bereits festgestellt haben, besteht die einzige Möglichkeit, eine Gruppe allgemeiner Funktionen zu definieren, die für Strukturen gelten kann, über Schnittstellen (z. B. die primitiven Typen in der .NET-Implementierung %code% ). Wenn Sie ein Array vom Typ %code% deklarieren möchten, werden leider alle Werte eingerahmt (Schnittstellenreferenzen sind Referenztypen, selbst wenn der zugrunde liegende Wert Werttypen ist).

Nehmen wir beispielsweise an, Sie deklarieren eine %code% Schnittstelle:

%Vor%

Und Sie haben einen oder mehrere Werttypen, die es implementieren:

%Vor%

Wann immer Sie das tun:

%Vor%

Die zweite Zeile wird den Wert von %code% enthalten und einen Verweis auf diesen umrahmten Wert in %code% speichern. Da Arrays nur eine Reihe von Variablen sind, gelten dieselben Regeln:

%Vor%

Alle Werte in %code% werden eingerahmt und ihre Referenzen gespeichert. Das ist anders als bei Ihnen:

%Vor%

Wo kein Boxen nötig ist.

Das hat Implikationen, die sich direkt auf das beziehen, was Sie suchen, weil das Boxen der Werte bedeutet, dass Sie keinen zusammenhängenden Werteblock mehr haben (gut, aber der zusammenhängende -Block ist einfach Referenzen; die Werte selbst liegen woanders).

Kapselung

Angesichts der Tatsache, dass Sie

  1. Verfügen Sie über eine API eines Drittanbieters mit einem definierten Typ, mit dem Sie interagieren müssen
  2. Die Anforderung, verschiedene Anwendungsfälle in Ihrem Code zu unterstützen und hierzu objektorientierte Entwurfsmuster zu verwenden

Sie sollten wirklich erwägen, die OpenGL-API zu verpacken. Angenommen, Sie haben Folgendes:

%Vor%

Was wahrscheinlich eine bessere Option wäre, wäre Ihre eigene Schnittstelle zu definieren und dann die OpenGL API zu verstecken:

%Vor%

(Dies ist offensichtlich ein künstliches Beispiel, aber es sollte zeigen, was ich zu vermitteln versuche, um eine Abstraktionsebene zwischen Ihrem Code und der anderen API einzuführen)

    
___ answer5007963 ___

Das geht grundsätzlich nicht. Sie können nicht von einer Struktur ableiten. Warum denkst du, willst du eine Struktur anstelle einer Klasse? Sie sagen "es muss ein Werttyp sein" - warum? Glauben Sie auch, dass die Vererbung die einzige Option ist, und nicht etwa die Zusammensetzung? Zum Beispiel könnten Sie verwenden:

%Vor%

Sie werden einfach nicht in der Lage sein, eine "abstrakte Struktur" oder etwas Ähnliches zu erhalten, daher schlage ich vor, dass Sie die Gründe hinter Ihren unerfüllbaren Anforderungen erläutern , anstatt sie nur als Anforderungen zu bezeichnen, die nicht vermieden werden können.

    
___ answer5008011 ___

Sie können Schnittstellen verwenden

%Vor%     
___ answer5007969 ___

In C # können Sie Interfaces verwenden, um mit Werttypen (Structs) etwas zu erreichen, das Polymorphismus ist, da Sie nicht direkt von %code% ableiten können, aber Sie können mehrere %code% -Typen spezifische Interfaces implementieren lassen.

Daher können Sie statt Ihrer Zusammenfassung %code% , %code% eine Schnittstelle haben, %code% .

%Vor%

Es ist jedoch äußerst selten, dass Sie eigene Werttypen implementieren müssen. Stellen Sie daher vor dem Fortfahren sicher, dass Sie eine Werttyp-Semantik benötigen. Wenn Sie eigene Werttypen implementieren, stellen Sie sicher, dass sie unveränderlich sind, da veränderbare Werttypen ein Gateway für alle Arten von schrecklichen Problemen sind.

Sie sollten sich darüber im Klaren sein, dass Boxen beim Casting auftreten ein Werttyp für eine Schnittstelle. Dies hat nicht nur Auswirkungen, wenn Ihre Wertetypen änderbar sind (machen Sie keine veränderbaren Werttypen), sondern verringert oder hebt höchstwahrscheinlich jeden Speichervorteil auf, den Sie durch die Verwendung eines Wertetyps je nachdem, wann oder wie Sie erhalten Tun Sie dies und ob Sie es für jeden Wert tun - verwenden Sie einen Profiler, wenn Sie sich nicht sicher sind.

    
___ answer12786180 ___

Eine unterschätzte Eigenschaft von Werttypen in .net ist, dass sie als generische Typen mit Schnittstellenbeschränkung übergeben werden können, ohne zu boxen. Zum Beispiel:

%Vor%

Beachten Sie, dass ich %code% -Parameter verwendet habe, um zusätzliche temporäre Kopien der beiden Parameter zu vermeiden; Eine zusätzliche Kopie von %code% wird am Ende erstellt, wenn sie an die %code% -Methode übergeben wird, und mindestens eine zusätzliche Kopie wird wahrscheinlich gemacht, wenn das Ergebnis zurückgegeben wird, aber zwei redundante Kopien herzustellen wäre besser als vier . In jedem Fall kann die oben genannte Methode aufgerufen werden, ohne einen beliebigen Typ %code% einzubetten, der %code% implementiert.

Leider gibt es keine besonders schöne Art zu sagen "wenn %code% ein Typ von Struktur ist, übergebe es an eine Methode, die diesen Typ annimmt; andernfalls, wenn es ein anderer Typ ist, übergib es an eine Methode und nimm diese" . Daher wird Code, der eine bestimmte exakte Klasse erfordert (wie der Code, der die API verwendet), wahrscheinlich nicht-generisch sein. Wenn es jedoch einige Methoden gibt, die auf einer Vielzahl von Strukturen verwendet werden können, kann das Bereitstellen dieser Schnittstellen die Implementierung von Schnittstellen und deren Übergabe als eingeschränkte generische Typen einige große Vorteile bieten.

    
___ answer5008006 ___

Es sieht so aus, als ob Sie eine Schnittstelle wünschen.

%Vor%

Eine Schnittstelle ist sinnvoll, da alle Ihre Methoden als abstrakt deklariert sind (dies würde bedeuten, dass Klassen abgeleitet werden müssen, um die Methode zu implementieren, die im Wesentlichen eine Schnittstelle ist)

    
___ antwort5007999 ___

Sie können Interface IVertex erstellen und dann zu Ihren Strukturen hinzufügen.

    
___ answer5008780 ___

Vielleicht können Sie einen "union" -Typ verwenden:

%Vor%

Denken Sie daran, es unveränderlich zu machen und nur auf die Felder zuzugreifen, die für jeden Typ Sinn ergeben.

    
___ tag123oop ___ Objektorientierte Programmierung ist ein Programmierparadigma, das "Objekte" verwendet: Datenstrukturen, die aus Datenfeldern und Methoden zusammen mit ihren Interaktionen bestehen. ___ tag123inheritance ___ Vererbung ist das System in der objektorientierten Programmierung, das es Objekten ermöglicht, Operationen zu unterstützen, die von anterioren Typen definiert sind, ohne eine eigene Definition angeben zu müssen. Es ist der Hauptvektor für Polymorphie in der objektorientierten Programmierung. ___ answer5007990 ___

Klassen können auch " Werttypen " sein (im Sinne von "Domain Driven Design"). Alles, was Sie tun müssen, ist, es unveränderlich zu machen, die Konstruktoren öffentlich zugänglich zu machen (Geschützt oder intern) und statische Factory-Methoden zu erstellen, um Instanzen von ihnen zu erstellen und deren Instanziierung zu steuern, und keine Setter für Ihre Eigenschaften haben ...

HINWEIS: Der Ausdruck Werttyp in diesem Kontext hat nichts mit Werttyp vs. Referenztyp zu tun. Es hat mit Werttyp vs Entitätstyp zu tun, wie in Domain Drtiven Design oder Domain Modeling verwendet ...

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123struct ___ Ein Schlüsselwort in verschiedenen Programmiersprachen, deren Syntax C ähnelt oder von C abgeleitet ist (C ++, C #, Swift, Go usw.). Verwenden Sie ein spezielles Programmiersprachen-Tag, um Fragen zu markieren, die die Verwendung einer 'struct' als Syntax beinhalten, und Semantik kann sprachabhängig sein. Schlüsselwort definiert oder deklariert einen Datentyp, der aus anderen Datentypen besteht. Jedes Mitglied einer Struktur hat seinen eigenen Speicherbereich (im Gegensatz zu einer "Union", deren Mitglieder einen einzigen Speicherbereich teilen). ___ qstnhdr ___ C # abstrakte Struktur ___ qstntxt ___

Wie kann ich Vererbung (oder ähnliches) mit Strukturen in C # erreichen? Ich weiß, dass eine abstrakte Struktur nicht möglich ist, aber ich muss etwas Ähnliches erreichen.

Ich brauche es als Struktur, weil es ein Werttyp sein muss. Und ich brauche Vererbung, weil ich ein generisches Array brauche und Methoden, die ich garantieren kann, sind da.

Ich denke, dass ein Beispiel einen langen Weg zurücklegen wird, also Code, der nicht kompiliert wird, aber zeigt, was ich erreichen möchte;

%Vor%

BEARBEITEN:

Der Grund, warum ich Werttypen brauche, ist, dass ich ein Array von ihnen erstellen kann, und es an OpenGL als Vertex-Puffer übergeben kann. Dazu müssen die Daten direkt in diesem Array enthalten sein.

Ich wäre überrascht, wenn das nicht möglich wäre.

    
___
quelle
0

Vielleicht können Sie einen "union" -Typ verwenden:

%Vor%

Denken Sie daran, es unveränderlich zu machen und nur auf die Felder zuzugreifen, die für jeden Typ Sinn ergeben.

    
Jordão 15.02.2011 19:52
quelle
-4

Klassen können auch " Werttypen " sein (im Sinne von "Domain Driven Design"). Alles, was Sie tun müssen, ist, es unveränderlich zu machen, die Konstruktoren öffentlich zugänglich zu machen (Geschützt oder intern) und statische Factory-Methoden zu erstellen, um Instanzen von ihnen zu erstellen und deren Instanziierung zu steuern, und keine Setter für Ihre Eigenschaften haben ...

HINWEIS: Der Ausdruck Werttyp in diesem Kontext hat nichts mit Werttyp vs. Referenztyp zu tun. Es hat mit Werttyp vs Entitätstyp zu tun, wie in Domain Drtiven Design oder Domain Modeling verwendet ...

    
Charles Bretana 15.02.2011 18:39
quelle

Tags und Links