c#.netで有効である場合、vb.netでインターフェイスReadonlyプロパティをオーバーライドできないのはなぜですか?
-
27-10-2019 - |
質問
(これはに関連しています この他の質問)
ゲッターのみのプロパティがあるインターフェイスを定義する場合(= vb.netでreadonly)、 C#ではなくクラスを実装する際にセッターを定義できますが、VBでは定義できますか ?
言語固有ではなく、.NETレベルで定義されていると思っていたでしょう。
例:このインターフェイスの場合
'VB.NET
Interface SomeInterface
'the interface only say that implementers must provide a value for reading
ReadOnly Property PublicProperty As String
End Interface
また
//C# code
interface IPublicProperty
{
string PublicProperty { get; }
}
これはC#の正しい実装です。
public class Implementer:IPublicProperty
{
private string _publicProperty;
public string PublicProperty
{
get
{
return _publicProperty;
}
set
{
_publicProperty = value;
}
}
}
しかし、これは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
更新2015/04/23
この機能は、VB14の一部として提供されていることがわかりました。見る 言語は、C#6およびVB 14の機能です と Visual Basic 14の新しい言語機能 :
readonlyインターフェイスプロパティは、readwriteプロップで実装できます。これにより、言語の風変わりなコーナーがクリーンアップされます。この例を見てください:
Interface I ReadOnly Property P As Integer End Interface Class C : Implements I Public Property P As Integer Implements I.P End Class
以前は、Readonly Property IPを実装していた場合、Readonlyプロパティでも実装する必要がありました。制限が緩和されたので、必要に応じて読み取り/書き込みプロパティで実装できます。この例では、読み取り/書き込みオートプロップで実装しますが、ゲッターとセッターを使用してプロパティを使用することもできます。
解決
VB.NETとC#が別のアクセントで話されているのと同じ言語であると仮定して注意してください - そうではありません。
vb.netには、インターフェイスメンバーの実装が必要なため Implements
句、どのメンバーが実装しているかを述べています。 C#を使用すると、インターフェイスメンバーを明示的に実装できます(VB.NETのようなもの)、または暗黙的に(VB.NETに相当するものはありません)。したがって、 実際 これのC#バージョンはです
public class Implementer : IPublicProperty
{
private string _publicProperty;
string IPublicProperty.PublicProperty // explicit implementation
{
get
{
return _publicProperty;
}
set
{
_publicProperty = value;
}
}
}
この します エラーを与えます:
エラーCS0550: 'consoleApplication171.implementer.consoleApplication171.ipublicproperty.publicproperty.set'インターフェイスメンバーのconsoleApplication171.ipublicproperty.publicporty.publicporty 'interfaceメンバーにはないアクセサを追加します。
他のヒント
.NETでは、インターフェイス内の読み取り専用プロパティの実装にはゲッターが含まれていますがセッターが含まれていないこと、および読み取りワイトプロパティの実装には、ゲッターとセッターの両方を含める必要があります。また、書き込みのみのプロパティを実装すること(そのようなものを定義する場合)がセッターを含むがゲッターが含まれていないことも必要です。
C#では、クラスがインターフェイス内のプロパティと同じ名前の公共プロパティを定義する場合、公共プロパティはそのインターフェイスで必要な方法を実装し、クラスはインターフェイスプロパティを明示的に実装していません。コンパイラはプロパティを自動的に生成します。必要に応じて、公共財産のゲッターおよび/またはセッターを使用します。クラスが3つのインターフェイスを実装していても、1つは読み取り専用プロパティを備えています Foo
, 、1つは書き込みのみのプロパティを備えています Foo
, 、および1つは読み取りワイトプロパティを備えています Foo
, 、単一の公開読み取りワイトプロパティ Foo
実装するために使用できます Foo
それらすべてのプロパティ。
概念的には、VB.NETが同様の機能を提供できず、インターフェイスを実装するために必要な2つの(または3つの)異なるプロパティを生成できなかった理由はありません。少なくとも現在、VB.NETクラスのメンバーがインターフェイスメンバーの実装としてマークされている場合、期待されるのは、ラッピングなしでメンバーと完全に一致することです。