Pourquoi ne peuvent-Interface propriétés ReadOnly être surchargées dans VB.NET, quand il est valide en C # .NET?

StackOverflow https://stackoverflow.com/questions/6341184

  •  27-10-2019
  •  | 
  •  

Question

(cela est lié à cette autre question )

Si vous définissez une interface où il y a une propriété avec seulement un getter (= ReadOnly en VB.NET), Pourquoi pouvez-vous définir le setter dans la mise en œuvre des classes C #, mais pas avec VB ?

J'aurais pensé qu'il a été défini au niveau .NET, et non la langue spécifique.

Exemple: pour cette interface

'VB.NET
Interface SomeInterface

    'the interface only say that implementers must provide a value for reading
    ReadOnly Property PublicProperty As String

End Interface

ou

//C# code
interface IPublicProperty
{
    string PublicProperty { get; }
}

Ceci est une mise en œuvre correcte en C #:

public class Implementer:IPublicProperty
    {
        private string _publicProperty;

        public string PublicProperty
        {
            get
            {
                return _publicProperty;
            }
            set
            {
                _publicProperty = value;
            }
        }
    }

Mais ce n'est pas valide dans VB.NET

Public Property PublicProperty As String Implements SomeInterface.PublicProperty
    Get
        Return _myProperty
    End Get
    Set(ByVal value As String)
        _myProperty = value
    End Set
End Property

Mise à jour 23/04/2015

Il se trouve que cette fonction vient dans le cadre de VB14! Voir Langues fonctionnalités en C # 6 et VB 14 et nouvelle langue fonctionnalités dans Visual Basic 14 :

propriétés d'interface ReadOnly peuvent être mises en œuvre par des accessoires ReadWrite Cela nettoie un coin bizarre de la langue. Regardez cet exemple:

Interface I
    ReadOnly Property P As Integer
End Interface


Class C : Implements I
    Public Property P As Integer Implements I.P
End Class

Auparavant, si vous implémentez la I.P propriété ReadOnly, puis il fallait la mettre en œuvre avec une propriété ReadOnly ainsi. Maintenant que restriction a été assouplie: vous pouvez la mettre en œuvre avec une lecture / écriture propriété si vous voulez. Cet exemple arrive à la mettre en œuvre avec lire / autoprop d'écriture, mais vous pouvez également utiliser une propriété avec getter et setter.

Était-ce utile?

La solution

Faites attention en supposant que VB.NET et C # sont les mêmes langue parlée avec un accent différent -. Ils ne sont pas

Parce que VB.NET nécessite la mise en œuvre d'un élément d'interface pour avoir cette clause Implements, en disant quel membre il met en œuvre. C # vous permet d'implémenter des membres d'interface explicitement (comme VB.NET DE SORT), ou implicitement (pas équivalent VB.NET). Par conséquent, le réelle Version C # de c'est

public class Implementer : IPublicProperty
{
    private string _publicProperty;

    string IPublicProperty.PublicProperty    // explicit implementation
    {
        get
        {
            return _publicProperty;
        }
        set
        {
            _publicProperty = value;
        }
    }
}

et ce fait donne une erreur:

erreur CS0550: 'ConsoleApplication171.Implementer.ConsoleApplication171.IPublicProperty.PublicProperty.set' ajoute un accesseur non trouvé dans un membre d'interface 'ConsoleApplication171.IPublicProperty.PublicProperty'

Autres conseils

Dans .net, il est nécessaire qu'une mise en œuvre d'une propriété en lecture seule dans une interface comprend un getter mais pas setter, et pour la mise en œuvre d'une propriété en lecture-écriture à inclure à la fois un getter et un setter. Il est également nécessaire pour la mise en œuvre d'une propriété en écriture seule (si l'on définit une telle chose) d'inclure un poseur mais pas getter.

En C #, si une classe définit une propriété publique avec le même nom comme une propriété dans une interface, les outils de propriété publique les méthodes requises par cette interface, et la classe n'implémente pas explicitement la propriété d'interface, le compilateur automatiquement générer une propriété qui utilise le getter et / ou poseur de la propriété publique, selon le cas. Même si une classe implémente trois interfaces, une avec une propriété en lecture seule Foo, une avec un Foo de propriété en écriture seule, et une avec une lecture-écriture propriété Foo, une seule propriété en lecture-écriture publique Foo peut être utilisé pour mettre en œuvre la propriété Foo pour tous.

Conceptuellement, il n'y a pas de raison de ne pas vb.net pourrait offrir une fonctionnalité similaire, et générer deux (ou même trois) différentes propriétés au besoin pour implémenter des interfaces. Au moins à l'heure actuelle, si un membre de la classe vb.net est marquée comme la mise en œuvre d'un élément d'interface, l'attente est qu'il correspondra au membre parfaitement sans emballage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top