问题描述
有VBA编码经验的人可以解释一下这种疯狂吗!
@MockBean(classes = BaseTests.Service.class)
class MockBeanTests extends BaseTests {
@BeforeEach
void setUpMock() {
when(service.getMessage()).thenReturn("mock");
}
@Test
@Override
void service() {
assertThat(service.getMessage()).isEqualTo("mock");
}
}
为什么 thisForm 在我询问它的一个控件之前不知道它的标题? 我从调用嵌套在模块中的过程的形式的命令按钮执行此操作
解决方法
这似乎是由于基类的属性没有正确映射到子类属性的错误造成的!
ACADProject.FormENU
继承自 MSForms.UserForm
。它比 MSForms.UserForm
具有更多的属性和方法,但它is a MSForms.UserForm
,因此它可以存储在类型为 MSForms.UserForm
的变量中。
看起来在内部 MSForms.UserForm
及其子类(由用户设计的实际用户表单)被实现为不同的对象,其中基虚拟对象的属性返回任何实际派生对象返回的属性(其中使它看起来更像是上面链接中的 has-a,而不是 is-a)。
并且似乎映射 MSForms.UserForm
的所有属性以返回实际子类的相应值的人忘记了映射 Caption
属性:
Dim FormAsSelf As UserForm1
Dim FormAsForm As MSForms.UserForm
Dim FormAsObject As Object
Set FormAsSelf = New UserForm1
Set FormAsForm = FormAsSelf
Set FormAsObject = FormAsSelf
Debug.Print "Caption from self: ",FormAsSelf.Caption,TypeName(FormAsSelf),ObjPtr(FormAsSelf),TypeOf FormAsSelf Is UserForm1
Debug.Print "Caption from form: ",FormAsForm.Caption,TypeName(FormAsForm),ObjPtr(FormAsForm),TypeOf FormAsForm Is UserForm1
Debug.Print "Caption from object: ",FormAsObject.Caption,TypeName(FormAsObject),ObjPtr(FormAsObject),TypeOf FormAsObject Is UserForm1
Unload FormAsSelf
标题 | 标题 | 类型名称 | 对象地址 | 是UserForm 吗? |
---|---|---|---|---|
来自自己的标题: | 用户表单1 | 用户表单1 | 4144272 | 真的 |
来自表单的标题: | 用户表单1 | 96261568 | 真的 | |
来自对象的标题: | 用户表单1 | 用户表单1 | 4144272 | 真的 |
其他属性似乎已正确映射,因此如果您设计一个粉红色背景的表单并请求 .BackColor
而不是上面代码中的 .Caption
,您将得到所有三个相同的答案(实际上是两个)表格的“侧面”:
标题 | 背景色 | 类型名称 | 对象地址 | 是 UserForm 吗? |
---|---|---|---|---|
来自自己的标题: | 16744703 | 用户表单1 | 4144272 | 真的 |
来自表单的标题: | 16744703 | 用户表单1 | 96261568 | 真的 |
来自对象的标题: | 16744703 | 用户表单1 | 4144272 | 真的 |
如相关问题下的 in a comment 所述,整个继承情况类似于 Sheet1
和 Worksheet
之间的关系。然而,这些似乎在内部实现不同,所以只有一个“方面”开始:
Dim SheetAsSelf As Sheet1
Dim SheetAsSheet As Excel.Worksheet
Dim SheetAsObject As Object
Set SheetAsSelf = ThisWorkbook.Worksheets(1)
Set SheetAsSheet = SheetAsSelf
Set SheetAsObject = SheetAsSelf
Debug.Print "Caption from self: ",SheetAsSelf.Name,TypeName(SheetAsSelf),ObjPtr(SheetAsSelf),TypeOf SheetAsSelf Is Sheet1
Debug.Print "Caption from sheet: ",SheetAsSheet.Name,TypeName(SheetAsSheet),ObjPtr(SheetAsSheet),TypeOf SheetAsSheet Is Sheet1
Debug.Print "Caption from object: ",SheetAsObject.Name,TypeName(SheetAsObject),ObjPtr(SheetAsObject),TypeOf SheetAsObject Is Sheet1
标题 | 姓名 | 类型名称 | 对象地址 | 是Sheet1 吗? |
---|---|---|---|---|
来自自己的标题: | 表 1 | 工作表 | 463669552 | 真的 |
来自工作表的标题: | 表 1 | 工作表 | 463669552 | 真的 |
来自对象的标题: | 表 1 | 工作表 | 463669552 | 真的 |
(不过,如果你深入挖掘,你会发现工作表甚至是crazier shenanigans!)