VB.NET 클래스는 기본 클래스를 상속하고 인터페이스 문제를 구현합니다(C#에서 작동).
저는 VB에서 클래스를 만들려고 합니다.기본 추상 클래스를 상속하고 인터페이스를 구현하는 NET.인터페이스가 Description이라는 문자열 속성을 선언합니다.기본 클래스에 Description이라는 문자열 속성이 포함되어 있습니다.기본 클래스는 기본 클래스를 상속하고 인터페이스를 구현합니다.기본 클래스에 Description 속성이 있으면 인터페이스 요구 사항이 충족됩니다.이는 C#에서는 정상적으로 작동하지만 VB에서는 문제가 발생합니다.그물.
먼저, 다음은 C# 코드가 작동하는 예입니다.
public interface IFoo
{
string Description { get; set; }
}
public abstract class FooBase
{
public string Description { get; set; }
}
public class MyFoo : FooBase, IFoo
{
}
여기 VB가 있습니다.컴파일러 오류가 발생하는 NET 버전:
Public Interface IFoo
Property Description() As String
End Interface
Public MustInherit Class FooBase
Private _Description As String
Public Property Description() As String
Get
Return _Description
End Get
Set(ByVal value As String)
_Description = value
End Set
End Property
End Class
Public Class MyFoo
Inherits FooBase
Implements IFoo
End Class
클래스를 (기본면만클들를스래▁(면▁if만들▁the)FooBase합니다.Implements IFoo.Description속성에 모든 것이 좋지만 기본 클래스가 인터페이스를 구현하는 것을 원하지 않습니다.
컴파일러 오류:
클래스 'MyFoo'는 인터페이스 '에 대해 '속성 설명() 문자열로'를 구현해야 합니다.IFoo'. 구현 속성에 일치하는 'ReadOnly' 또는 'WriteOnly' 지정자가 있어야 합니다.
VB.NET에서 이 작업을 처리할 수 없습니까? 아니면 이 작업을 수행하려면 구문을 변경해야 합니까?
의 재산을 자을다같표합야니로 .Overridable또는MustOverride기본 클래스에서 이를 재정의할 수 있습니다.
Public MustInherit Class FooBase
Private _Description As String
Public Overridable Property Description() As String
Get
Return _Description
End Get
Set(ByVal value As String)
_Description = value
End Set
End Property
End Class
Public Class MyFoo
Inherits FooBase
Implements IFoo
Public Overrides Property Description() As String Implements IFoo.Description
Get
Return MyBase.Description
End Get
Set(ByVal value As String)
MyBase.Description = value
End Set
End Property
End Class
편집 @M.A. Hanin이 올린 글에 대한 답변입니다.두 솔루션 모두 작동하지만 각각의 영향을 이해하는 것이 중요합니다.다음 코드를 상상해 보십시오.
Dim X As FooBase = New MyFoo()
Trace.WriteLine(X.Description)
X에서 나오는 것.설명?재정의 가능을 사용하면 하위 클래스에 대한 호출을 받을 수 있고 오버로드 방법을 사용하면 기본 클래스에 대한 호출을 받을 수 있습니다.옳고 그른 것은 없으며, 선언의 결과를 이해하는 것이 중요할 뿐입니다.오버로드 방법을 사용하여 하위 구현을 얻으려면 업캐스트해야 합니다.
Trace.WriteLine(DirectCast(X, MyFoo).Description)
마이베이스에 전화하시는 거라면.어린이 클래스의 설명은 문제가 없지만, 어린이 클래스의 정의를 변경한 경우에는 무슨 일이 일어나고 있는지 확실히 이해해야 합니다.
어떤 방식으로든 IFoo 인터페이스의 구현 세부 정보를 지정해야 합니다.
이 간단한 옵션은 어떻습니까?
Public Class MyFoo
Inherits FooBase
Implements IFoo
Overloads Property Description() As String Implements IFoo.Description
Get
Return MyBase.Description
End Get
Set(ByVal value As String)
MyBase.Description = value
End Set
End Property
End Class
VB에서는 구현 속성이 구현을 선언해야 합니다.이것은 제가 VB의 좋은 기능이라고 생각하기 때문입니다. C#에서는 가끔 놓치기도 합니다. 인터페이스 멤버를 구현하는 멤버의 이름을 바꿀 수 있습니다.
따라서 구현하지 않고 이 작업을 수행할 수 있는 유일한 방법은IFoo.Description에FooBase선언하는 것입니다.Description Overridable그런 다음 정의합니다.MyFoo다음과 같이:
Public Class MyFoo
Inherits FooBase
Implements IFoo
Public Overrides Property Description() As String Implements IFoo.Description
Get
Return MyBase.Description
End Get
Set(ByVal value As String)
MyBase.Description = value
End Set
End Property
End Class
파티에 늦었으면 미안하고, 이 기능이 에만 도입되었다면 미안합니다.NET 4, 하지만 다음은 가능합니다 (지금)
Public Interface IFoo
Property Description() As String
End Interface
Public MustInherit Class FooBase
Implements IFoo
Public MustOverride Property Description As String Implements IFoo.Description
End Class
Public Class MyFoo
Inherits FooBase
Private _description As String
Public Overrides Property Description As String
Get
Return _description
End Get
Set(value As String)
_description = value
End Set
End Property
End Class
VB.NET은 암시적 구현을 지원하지 않습니다.저 또한 이 문제에 부딪혀서 많은 어려움을 겪었습니다.
명시적으로 선언해야 하는 생성된 클래스(엔티티 등)로 작업하는 경우Implements IFoo그것은 그것을 전혀 불가능하게 만듭니다.
그래서 저는 마이크로소프트에 연결을 제출했고 당신이 투표하기를 바라며 다음 버전의 VB는 컴파일러를 더 똑똑하게 개선할 것입니다.
제 담당자 때문에 M.A. Hanin의 답변에 대해 언급할 수는 없지만, 기본 클래스의 속성을 재정의하고 싶지 않거나 재정의할 수 없다고 가정할 때 기본 메서드 숨기기에 대한 컴파일러 경고를 피하기 위해 한 가지 작은 수정을 권장합니다.
Public Class MyFoo
Inherits FooBase
Implements IFoo
Private Property IFoo_Description() As String Implements IFoo.Description
Get
Return Me.Description
End Get
Set(ByVal value As String)
Me.Description = value
End Set
End Property
End Class
이것은 이상한 문제이며 C#과 VB의 차이를 분명히 보여줍니다.NET 컴파일러.추상 기본 클래스에 인터페이스를 구현하는 것이 좋습니다. 그러면 VB가 만들어집니다.NET 컴파일러 happy 및 실행 시 하위 클래스에는 실제로 구현되었음을 나타내는 메타데이터가 남아 있습니다.IFoo.
하위 클래스가 인터페이스를 구현한다고 선언해야 하는 특별한 이유가 있습니까?
언급URL : https://stackoverflow.com/questions/2607884/vb-net-class-inherits-a-base-class-and-implements-an-interface-issue-works-in-c
'programing' 카테고리의 다른 글
| Node.js에서 MongoDB 연결을 위한 최상의 방법은 무엇입니까? (0) | 2023.05.13 |
|---|---|
| PostgreSQL로 데이터베이스 테이블 다이어그램을 생성하는 도구? (0) | 2023.05.13 |
| NPM 패키지의 이전 버전을 설치하는 방법은 무엇입니까? (0) | 2023.05.13 |
| VB에 잠금 문이 있습니까?NET? (0) | 2023.05.13 |
| 다중 필드 mongo DB에서 정렬 (0) | 2023.05.13 |