2010-09-08 43 views
11

Ví dụ tôi có hạng A mà thực hiện lớp BVBA thừa kế, tương tự của siêu

--- hạng A ----

implements B 
public sub B_do() 
end sub 

--class B ----

public sub do() 
end sub 

Làm cách nào tôi có thể gọi do() từ A? (super.do()) Vì vậy, làm thế nào tôi có thể xác định một số biến phổ biến cho cả hai lớp học? Bây giờ tôi có thể kế thừa duy nhất chức năng, phụ và tài sản ...

thêm: cùng một câu hỏi http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/5a83d794-3da1-466a-83d3-5d2eb0a054b2

thêm: Không thể để chia sẻ biến trên hierarhy của các lớp học. Bạn nên thực hiện các thuộc tính (giống như các hàm).

Trả lời

19

Cách thông thường để làm điều này trong VBA là phải có một chứa một thể hiện của B cũng như có một thực hiện giao diện của B, và sau đó ủy thác cuộc gọi đến các giao diện B A đến nội B.

này là những thứ cũ, nhưng thấy Visual Studio 6.0 Lập trình Hướng dẫn:

http://msdn.microsoft.com/en-us/library/aa716285(VS.60).aspx

có một chương về "Nhiều (Inter) Faces của Bộ luật Tái sử dụng" mô tả quy ước này:

http://msdn.microsoft.com/en-us/library/aa240846(v=VS.60).aspx

Cách MS mô tả nó là:

Ngoài việc thực hiện trừu tượng giao diện, bạn có thể sử dụng lại mã của bạn bằng cách thực hiện giao diện của một lớp học bình thường , và sau đó chọn lọc ủy thác cho một ẩn ví dụ của lớp .

Điều này có nghĩa là việc thừa kế triển khai yêu cầu nhiều phương thức ủy quyền rõ ràng. Thậm chí còn có một phân nhóm chương: "Không phải là điều này có tẻ nhạt?". Tuy nhiên, một lý do tại sao OOP trong VBA là một Pita (TM) ...

EDIT RẰNG sẽ không phù hợp trong một chú thích:

Để trả lời những câu hỏi mà bạn đặt ra trong bình luận của bạn, tốt, A a B. Khi bạn thực hiện giao diện A thực hiện B, bạn chủ yếu nói rằng bạn có thể xử lý một thể hiện của A như thể nó thực sự thuộc loại B. Trong VBA, cách bạn làm điều đó là khai báo một biến kiểu B, và sau đó đặt nó vào một trường hợp của A. VBA sẽ biết phải làm gì khi bạn gọi nó như một 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 

Theo như những gì bạn thấy trong deb ug cửa sổ, tôi không lý do tại sao nó xuất hiện theo cách đó. Và theo như phái đoàn bị ép buộc, tôi không chắc ý bạn là gì. VBA tự động gửi các cuộc gọi đến giao diện B đến đúng phương thức trong lớp A. Nếu bạn có nghĩa là tự động tạo ra các mã để kế thừa thực hiện B theo cách mô tả ở trên, không có gì giống như tôi biết cho VBA. Tôi nghĩ rằng các phiên bản "chuyên nghiệp" khác nhau của VB6 có thể làm điều đó, nhưng tôi chưa bao giờ sử dụng VB6 vì vậy tôi không biết.

+0

Cảm ơn! Bạn có biết một số nguồn về chính xác instancing của các lớp học trong VBA?Trong debug, tôi thấy rằng lớp A có một trường kiểu B. Vì vậy, ở đâu đó trên internet tôi thấy rằng đối tượng kiểu A là một đối tượng kiểu B (!), Quả thật vậy; với phái đoàn bắt buộc. – nikaan

+0

@Nikita, tôi sẽ đọc qua các chương khác trong Hướng dẫn của Lập trình viên để đối phó với "lập trình với các đối tượng". Theo như câu hỏi khác, tôi sẽ chỉnh sửa câu trả lời của tôi, vì nó có lẽ sẽ không phù hợp trong một bình luận. Vì vậy, hãy tìm trong vài phút ... – jtolle

Các vấn đề liên quan