VBA 상속, 슈퍼의 아날로그
예를 들어 저는 B 클래스를 구현하는 A 클래스를 가지고 있습니다.
---A급 ----
implements B
public sub B_do()
end sub
--B급 ----
public sub do()
end sub
A에서 do()를 어떻게 부를 수 있을까요? (super.do ) 그렇다면, 두 클래스 모두에 대한 공통 변수를 어떻게 정의할 수 있을까요?이제 함수, 하위 및 속성만 상속할 수 있습니다.
추가됨: 동일한 질문 http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/5a83d794-3da1-466a-83d3-5d2eb0a054b2
추가됨: 클래스 계층 간에 변수를 공유할 수 없습니다.속성을 구현해야 합니다(함수와 동일한 방법).
VBA에서 이를 수행하는 일반적인 방법은 A가 B의 인스턴스를 포함하고 A가 B의 인터페이스를 구현하도록 한 다음 A의 B 인터페이스에 대한 호출을 내부 B로 위임하는 것입니다.
이것은 오래된 것이지만 Visual Studio 6.0 프로그래머 설명서를 참조하십시오.
http://msdn.microsoft.com/en-us/library/aa716285(VS.60).aspx
"The Many (Inter)"에 대한 장이 있습니다.이 관례를 설명하는 "코드 재사용의 얼굴":
http://msdn.microsoft.com/en-us/library/aa240846(v=VS.60).aspx
MS가 설명하는 방식은 다음과 같습니다.
추상 인터페이스를 구현하는 것 외에도 일반 클래스의 인터페이스를 구현한 다음 클래스의 숨겨진 인스턴스에 선택적으로 위임하여 코드를 재사용할 수 있습니다.
이는 구현 상속에 많은 명시적 위임 방법이 필요하다는 것을 의미합니다.심지어 "이것은 지루하지 않나요?"라는 장 제목도 있습니다.VBA의 OOP가 PITA(TM)인 또 다른 이유는...
설명에 맞지 않는 편집:
당신이 댓글에 올린 질문에 답하자면, A는 B입니다.당신이 A가 B의 인터페이스를 구현하도록 할 때, 당신은 본질적으로 A의 인스턴스를 실제로 B 유형인 것처럼 처리할 수 있다고 말합니다.VBA에서 이를 수행하는 방법은 B 유형의 변수를 선언한 다음 A 인스턴스로 설정하는 것입니다. VBA는 B와 같이 호출할 때 무엇을 해야 하는지 알 수 있습니다.
Dim usedAsB as B
Dim anA as A
Set anA = New A
Set usedAsB = anA 'fine since A implements B
usedAsB.something() 'will call B_something() defined in class A
디버그 창에 표시되는 내용에 대해서는 왜 그런 식으로 표시되는지 모르겠습니다.그리고 강제 위임에 대해서는 무슨 말인지 잘 모르겠습니다. VBA는 자동으로 B 인터페이스로 호출을 A 클래스의 올바른 메서드로 보냅니다.위에서 설명한 방식으로 B의 구현을 상속하기 위해 코드를 자동으로 생성하는 것을 의미한다면, VBA에 대해 제가 아는 것과 같은 것은 없습니다.VB6의 다양한 "프로" 버전이 그럴 수 있다고 생각하지만, 저는 VB6를 사용해 본 적이 없어서 잘 모르겠습니다.
이것이 제가 인터페이스를 통해 추상적인 수업을 시뮬레이션하기 위해 오랫동안 사용해온 방법입니다.
'class module: IBase
'We define a base interface
'
Sub go(): End Sub
Sub gogo(): End Sub
이제 추상 클래스 'B'부터 시작하여 다른 클래스를 정의하겠습니다.
'
'class module: B
'
Implements IBase
'Daughter classes should implement 'go'
'Note that the method is 'Public'
Public Sub go(): End Sub
'Let's agree that every daughter class implements the method
'abstract 'super' that returns the IBase interface
Public Property Get super() As IBase: End Property
'
'The signature of other abstract methods can be stated here
'
'Public Sub goGoChild(): End Sub
'Public Function goGoGoChild2(): End Function
'
'
'Note that the methods are accessible through the IBase interface
'
Private Sub IBase_go()
Debug.Print "B: super.go()"
End Sub
Private Sub IBase_gogo()
Debug.Print "B: super.gogo()"
End Sub
추상 클래스 'B'를 구현하는 클래스 'A'를 생성합니다.
'
'class module: 'A'
'
'We started implementing the abstract class B
Implements B
'we define a private type 'myType'
Private Type myType
'variable that references an instance of 'B'
objB As B
'variable that references the interface of 'B'
objIB As IBase
End Type
'VBA version of 'this'
Private this As myType
'
'Every class that implements 'B' (abstract class)
'you must initialize in your constructor some variables
'of instance.
'
Private Sub Class_Initialize()
With this
'we create an instance of object B
Set .objB = New B
'the variable 'objIB' refers to the IBase interface, implemented by class B
Set .objIB = .objB
End With
End Sub
'Visible only for those who reference interface B
Private Property Get B_super() As IBase
'returns the methods implemented by 'B', through the interface IBase
Set B_super = this.objIB
End Property
Private Sub B_go()
Debug.Print "A: go()"
End Sub
'==================================================
'Class 'A' local method
Sub localMethod1()
Debug.Print "A: Local method 1"
End Sub
그리고 마지막으로 '메인' 모듈을 만들어 보겠습니다.
Sub testA()
'reference to class 'A'
Dim objA As A
'reference to interface 'B'
Dim objIA As B
'we create an instance of 'A'
Set objA = New A
'we access the local methods of instance 'A'
objA.localMethod1
'we obtain the reference to interface B (abstract class) implemented by 'A'
Set objIA = objA
'we access the 'go' method, implemented by interface 'B'
objIA.go
'we go to the 'go' method of the super class
objIA.super.go
'we access the 'gogo' method of the super class
objIA.super.gogo
End Sub
검증 창에서 출력은 다음과 같습니다.
A: Local method 1
A: go()
B: super.go()
B: super.gogo()
상속을 흉내내기 위해 속임수를 쓸 수 있습니다.기본 멤버 속성을 사용하여 작동합니다.
파생 클래스에 Superclass 유형의 Super라는 속성을 지정한 경우 이 속성을 기본 멤버로 지정합니다(파일을 내보내고 편집하여 포함).Attribute Item.VB_UserMemId = 0
그러면 한 쌍의 둥근 괄호(기본 구성원으로 해결됨)만으로 슈퍼클래스에 도달할 수 있습니다.
이 블로그 게시물은 전체 세부 정보를 제공하지만, 작성자(공개, 나)는 'Super' 대신 'Base'를 사용합니다.
그 구문이 당신에게 충분히 엄격하기를 바랍니다.
저는 또한 이것이 C#이 하는 것처럼 모든 기본 계층의 내부 배짱을 드러내는 것은 아니라는 것을 지적합니다.이것은 내 방법이 취약한 기본 클래스 문제로 고통받지 않는다는 것을 의미합니다.즉, 내 방법은 캡슐화를 유지하여 IMHO를 개선합니다.
언급URL : https://stackoverflow.com/questions/3669270/vba-inheritance-analog-of-super
'bestsource' 카테고리의 다른 글
윈도우즈 7에 ROracle 패키지를 설치하는 방법은 무엇입니까? (0) | 2023.07.03 |
---|---|
예외: BSON 유형 EOO에서 날짜로 변환할 수 없습니다. (0) | 2023.07.03 |
한 구성 요소에서 다른 구성 요소로 양식 데이터 전달 (0) | 2023.07.03 |
Linux에서 select를 사용하는 이유 (0) | 2023.07.03 |
목표 세션을 유지하기 위한 모범 사례 (0) | 2023.07.03 |