web-dev-qa-db-fra.com

Hériter de struct

Je suis essayer de comprendre quel est le problème avec mon code. J'ai ce code:

public struct MyStructA
{
    public MyStructA(string str)
    {
        myString= str;
    }

    public string myString;
}

public struct MyStructB: MyStructA
{
    public string myReversString;
}

Et j'obtiens cette erreur:

Error at compile time: Type 'MyStructA' in interface list is not an interface

Je ne comprends pas pourquoi? la structure .net pas implemnet comme classe?

15
user2110292

Une structure est implicitement scellée

Selon ce lien link :

Chaque structure en C #, qu’elle soit définie par l’utilisateur ou définie dans le .NET Framework, est scellée, ce qui signifie que vous ne pouvez pas en hériter. Une structure est scellée car il s'agit d'un type de valeur et tous les types de valeur sont scellés.

Une structure peut implémenter une interface, il est donc possible de voir un autre nom de type après deux points, après le nom de la structure.

Dans l'exemple ci-dessous, nous obtenons une erreur de compilation lorsque nous essayons de définir une nouvelle structure qui hérite de celle définie ci-dessus.

public struct PersonName
{
    public PersonName(string first, string last)
    {
        First = first;
        Last = last;
    }

    public string First;
    public string Last;
}

// Error at compile time: Type 'PersonName' in interface list is not an interface
public struct AngryPersonName : PersonName
{
    public string AngryNickname;
}
26
One Man Crew

Les types de valeur dans .NET sont étranges en ce sens qu'ils sont définis bien qu'ils soient des classes dérivées d'une classe spéciale appelée ValueType. Pour chaque type de valeur, il existe un type d'objet tas qui se comporte comme un objet de classe dérivé de ValueType, mais un emplacement de stockage de type valeur contient une collection d'octets représentant soit une valeur primitive, soit la concaténation des octets. nécessaire pour tenir tous ses domaines publics et privés.

Etant donné que les emplacements de stockage de type valeur ne contiennent que les octets nécessaires pour représenter leurs valeurs et ne contiennent aucune information de type, ni aucune référence à un objet susceptible de contenir des informations de type, le code qui utilise un emplacement de stockage de type valeur doit savoir exactement de quoi il s'agit.

L'héritage conventionnel exige que les objets contiennent des informations sur leur propre type, mais il n'existe aucune disposition permettant à des types de valeur de le faire.

Il serait conceptuellement possible (et utile) pour .NET d'autoriser certaines formes limitées d'héritage de type valeur avec certaines règles spéciales, telles que, bien qu'une variable BaseStructure puisse uniquement contenir un BaseStructure et ne puisse pas tenir un DerivedStructure. On pourrait définir un StructureUser<T> where T:BaseStructure, et une telle classe ou méthode pourrait accepter tout dérivé de BaseStructure et utiliser ces membres - y compris les champs - qui étaient communs au type de base.

Malheureusement, il serait difficile de définir des règles pour les génériques de manière à se comporter de manière cohérente dans les scénarios autorisés sans toutefois casser le code existant.

Par exemple, dans une classe Foo<T,U> where T:U, il est toujours possible de stocker un T dans une variable de type U, même si U est un type de valeur (car les types de valeur sont scellé, T et U sont garantis comme le même type). Si U pourrait être un type de valeur héritable et T pourrait être un dérivé, une telle garantie ne serait pas valable.

Compte tenu des difficultés liées à un tel héritage, une alternative plus utile serait de fournir un moyen sûr (même limité) via lequel une propriété pourrait exposer un byref ou un const-byref (un byref est la chose qui est transmise lorsqu'un paramètre utilise un qualificatif ref).

Une telle caractéristique supprimerait la distinction sémantique inévitable entre champs et propriétés et, en fonction de la manière dont elle aurait été mise en œuvre, pourrait offrir certains avantages majeurs, même lorsqu'elle était utilisée avec des classes (par exemple, elle pourrait permettre un mélange efficace de types immuables et mutables).

4
supercat

Struct ne supporte pas l'héritage, si vous avez besoin d'utiliser class, voir msdn

Il n'y a pas d'héritage pour les structures comme il en existe pour les classes. Une structure Ne peut pas hériter d'une autre structure ou classe, et ne peut pas être la base D'une classe. Cependant, les structures héritent de la classe de base Object. Une structure Peut implémenter des interfaces et le fait exactement comme le font les classes .

3
Adil

L'héritage n'est pas autorisé entre les structures, mais les structures peuvent implémenter des interfaces.

1
boli

Les structures peuvent implémenter une interface mais elles ne peuvent pas hériter d'une autre structure. Pour cette raison, les membres de la structure ne peuvent pas être déclarés protégés.

1
user2110287

De MSDN ;

Il n'y a pas d'héritage pour les structures comme il en existe pour les classes . Une structure Ne peut pas hériter d'une autre structure ou classe, et ne peut pas être la base D'une classe. Cependant, les structures héritent de la classe de base Object. Une structure Peut implémenter des interfaces et le fait exactement comme le font les classes .

Mais rappelez-vous, puisque les structures sont un type valeur et qu'elles héritent de System.ValueType

0
Soner Gönül