- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
读完 Ian Boyd 后的构造函数系列问题( 1 、 2 、 3 、 4 ),我意识到我不太明白隐藏内容的字面含义。
我知道(如果我错了,请纠正我)override
的唯一目的是能够具有多态行为,以便运行时可以根据实际类型解析方法实例 - 与声明的类型相反。考虑以下代码:
type
TBase = class
procedure Proc1; virtual;
procedure Proc2; virtual;
end;
TChild = class(TBase)
procedure Proc1; override;
procedure Proc2; // <- [DCC Warning]
end;
procedure TBase.Proc1;
begin
Writeln('Base.Proc1');
end;
procedure TBase.Proc2;
begin
Writeln('Base.Proc2');
end;
procedure TChild.Proc1;
begin
inherited Proc1;
Writeln('Child.Proc1');
end;
procedure TChild.Proc2;
begin
inherited Proc2;
Writeln('Child.Proc2');
end;
var
Base: TBase;
begin
Base := TChild.Create;
Base.Proc1;
Writeln;
Base.Proc2;
Base.Free;
Readln;
end.
哪些输出:
Base.Proc1
Child.Proc1
Base.Proc2
TChild.Proc2
上的警告 states that此方法“将隐藏对同名基础方法的访问”。我看到的是,如果我不重写 Proc2,我就会失去该方法解析其实际类型的能力,而不是其基本类型的能力。如何隐藏对 base 方法的访问?
此外,记录下有关警告的文档作为警告的解决方案,其中指出:
First, you could specify override to make the derived class' procedure also virtual, and thus allowing inherited calls to still reference the original procedure.
现在,如果我从“TChild”(无多态性)创建“TChild”实例,则非重写方法中的继承调用显然引用原始过程。如果我从“TBase”创建“Child”实例,调用甚至不会解析为“TChild”方法,我怎么能调用引用任何内容的“Inherited”?
我有什么误解吗?
最佳答案
除此之外,您将无法定义
TGrandChild = class(TChild)
procedure Proc2; override;
end;
因为 TGrandChild 看到的 Proc2 是来自 TChild 的非虚拟 Proc2。 TChild.Proc2 对后代隐藏 TBase.Proc2。
编辑:
回应 Sertac 的评论:
var
Base: TBase;
Child : TChild
begin
Child := TChild.Create;
Base := Child;
Base.Proc2;
Child.Proc2;
Base.Free;
Readln;
这将输出
Base.Proc2
Base.Proc2
Child.Proc2
因此,看似两次调用同一方法实际上是调用 2 个不同的方法。这使得代码更难理解(这不实用)并产生意想不到的行为。
关于delphi - "Method ' %s ' hides virtual method of base type ' %s '"。到底隐藏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3878576/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!