VBA는 OOP 언어이며 다형성을 지원합니까?
저는 사실 첫 VBA 프로젝트를 진행하고 있습니다.(C++에서)
Microsoft Excel 워크북에서 사용하는 기존 VBA 프로젝트를 클래스 및 다형성을 구현하여 개선하고 싶습니다.
문제는 다음과 같습니다.
1 - VBA가 OOP(Object Oriented Programming) 언어가 아니며 다형성을 지원하지 않는다는 기사를 많이 읽었습니다.
이들 중 일부는 Implements 키워드를 사용하여 회피책을 제안합니다.
2 - 이와 같은 웹 페이지도 몇 개 찾았습니다.이 웹 페이지는 상속, 오버라이드, 오버라이드, MustOverrides 등의 키워드를 사용하여 VBA에서 OOP 및 다형성을 실행하는 방법을 설명하고 있습니다.
제 질문은 다음과 같습니다.
VBA는 OOP 언어이며 다형성을 지원합니까?
OOP는 4개의 "필러"에 있습니다.
추상화 - 논리 및 개념을 추상화하려면 클래스 모듈에서 개체를 정의해야 합니다.엄밀히 말하면, 추상화는 의미 있는 식별자를 사용하여 절차 코드를 메서드(클래스 멤버)로 추출함으로써 달성됩니다.
다음은 추상화를 보여주는 VBA로 작성된 절차의 예입니다.
Public Sub Test(ByVal checkin As Date, ByVal checkout As Date, ByVal custType As CustomerType) Dim finder As New HotelFinder InitializeHotels finder Debug.Print finder.FindCheapestHotel(checkin, checkout, custType) End Sub
알 수 있어요.
Test
추상화 레벨이 매우 높기 때문에 프로시저는 한눈에 알 수 있습니다.구현에 대한 자세한 내용은 보다 전문적인 오브젝트와 메서드로 추상화됩니다.캡슐화 - 클래스는 속성에 의해 공개되는 개인 필드를 가질 수 있으며 클래스를 만들 수 있습니다.
PublicNotCreatable
(클래스 모듈을 내보내고 마음에 드는 텍스트 에디터로 열고 수동으로 클래스 속성을 편집하고 모듈을 다시 Import함으로써) 다른 VBA 프로젝트에 효과적으로 유형을 노출시킬 수 있습니다.파라미터화된 컨스트럭터가 없다는 사실은 관계가 없습니다.마음에 드는 파라미터를 모두 사용하여 인스턴스를 반환하는 팩토리 메서드를 작성하기만 하면 됩니다.【COM】【COM】【COM】【COM】【COM】【COM】【COM】【COM】를 들면, 이 가 있습니다.
HotelFinder
위의 스니펫의 클래스는Collection
합니다.Property Get
- 이 코드는 accessor를 할 수 없습니다. - accessor는 accessor입니다.Set
이 참조는 다음과 같이 캡슐화되어 있습니다.Private Type TFinder Hotels As Collection End Type Private this As TFinder Public Property Get Hotels() As Collection Set Hotels = this.Hotels End Property Private Sub Class_Initialize() Set this.Hotels = New Collection End Sub Private Sub Class_Terminate() Set this.Hotels = Nothing End Sub
다형성 -
Implements
추상 를 , 「 쪽인가」에 대해서, 「 쪽인가 하면, 「어느 쪽인가」, 「어느 쪽인가」, 「어느 쪽인가」, 「어느 쪽인가」, 「어느 쪽인가」, 「어느 쪽인가」에 , 를 작성할 수 있습니다.ISomething
로 추상화Foo
★★★Bar
(특정))Foo
★★★★★★★★★★★★★★★★★」Bar
다 ''를 구현합니다.ISomething
- 필요한 는 )- 「 」입니다.ISomething
메서드 오버로드는 VBA에 없는 언어 기능이지만 오버로드는 다른 기본 형식(데이터 유형)에 대해 동일한 인터페이스를 제공하는 기능인 다형성과는 관련이 없습니다.다형성입니다.
LogManager.Register
는 메서드를 오브젝트에 대해 할 수 .ILogger
서는 「」)DebugLogger
a. a. a.FileLogger
그되고 있습니다.이 경우, 「」는 「2」입니다.LogManager.Log(ErrorLevel, Err.Description)
두작업을 합니다.DebugLogger
즉시 툴창으로 출력됩니다.FileLogger
합니다.LogManager.Register DebugLogger.Create("MyLogger", DebugLevel) LogManager.Register Filelogger.Create("TestLogger", ErrorLevel, "C:\Dev\VBA\log.txt")
상속 - VBA에서는 다른 유형에서 유형을 파생할 수 없습니다. 상속은 지원되지 않습니다.
여기서 질문은 상속을 지원하지 않는 언어가 "객체 지향"으로 인정될 수 있는가 하는 것입니다.구성이 상속보다 선호되는 경우가 매우 많은 것으로 밝혀졌는데, 여기에는 여러 가지 주의 사항이 있습니다.그리고 VBA를 통해 원하는 대로 객체를 구성할 수 있습니다.
VBA는 OOP 언어입니까?
부족한 것은 상속뿐이고, 그 구성이 상속보다 더 좋다는 것을 고려하면, 저는 "네"라고 대답하고 싶습니다.이전에도 완전한 OOP VBA 코드(Model-View-Presentor with Unit-of-Work and Repository)를 작성한 적이 있습니다.이 코드에서는 상속을 지원하는 "진짜 OOP" 언어로 이와 다르지 않습니다.
다음은 모두 100% VBA의 몇 가지 예입니다.
- Model-View-ViewModel 인프라스트럭처 및 예시(개념 증명)
- 모델 뷰 컨트롤러(MVC) 아키텍처를 통한 본격적인 OOP 배틀십 게임
- 재사용 가능한 진행률 표시기
- 모델-뷰-프레젠터 패턴
- 저장소 패턴이 있는 Unit Of Work
- 다형 로거
- 자동 장치 테스트 프레임워크
이 마지막 링크의 코드는 결국 C#으로 포팅되어 VBA IDE의 COM 애드인으로 빠르게 발전하여 리팩터링, 더 나은 네비게이션, 코드 검사 및 기타 도구를 제공합니다.
VBA는 당신이 만드는 만큼만 제한됩니다.
짧은 대답은 '아니오'와 '아니오'입니다.
VBA는 객체 기반이므로 클래스를 정의하고 객체의 인스턴스를 만들 수 있지만 일반적으로 완전한 OOP 언어와 관련된 기능은 없습니다.예를 들어 다음과 같습니다.
- 캡슐화 및 추상화: VBA는 이를 어느 정도 제공합니다.퍼블릭 인터페이스가 정의된 클래스는 비공개로 유지할 수 있지만 클래스 내에 컨스트럭터를 위한 프로비저닝은 없습니다.클래스에는 일부 구성 작업은 수행할 수 있지만 인수를 사용할 수 없는 이벤트가 있습니다.인수를 전달하려면 공용 팩토리 함수 해결 방법이 여전히 생성자 스타일의 설계 패턴을 생성하기 위해 필요합니다.
- 상속:VBA에는 실제로 존재하지 않지만 거의 복제할 수 있습니다.
- (인터페이스 사용)
Implements
그러나 (예를 들어) 함수를 과부하하는 기능은 존재하지 않으며 각 "기능"은 기술적으로 고유한 함수 이름을 필요로 합니다.함수 또는 서브에 유일한 매개 변수로 객체를 전달하여 이 문제를 해결하고 속성 값에 따라 절차를 변경할 수 있습니다.
따라서 오브젝트 조작은 어느 정도 가능하며 MS Office 어플리케이션은 오브젝트 모델을 기반으로 하지만 VBA는 오브젝트 지향 언어가 아닙니다.다형성은 C++에서 익숙한 범위 내에서 달성될 수 없습니다.
언급URL : https://stackoverflow.com/questions/31858094/is-vba-an-oop-language-and-does-it-support-polymorphism
'sourcecode' 카테고리의 다른 글
목록을 피클 파일에 덤프하고 나중에 다시 검색 (0) | 2023.04.09 |
---|---|
첫 페이지에서만 iPhone 탐색 모음 숨기기 (0) | 2023.04.09 |
WPF 애플리케이션을 재기동하려면 어떻게 해야 하나요? (0) | 2023.04.09 |
UIBarButtonItem을 표시하거나 숨기려면 어떻게 해야 합니까? (0) | 2023.04.09 |
WPF의 텍스트 블록에 스트로크 적용 (0) | 2023.04.09 |