首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Delphi编译器何时创建隐式接口变量?

Delphi编译器在以下情况下会创建隐式接口变量:

  1. 当一个类实现了一个接口,并且在类的实现中没有显式地声明接口变量时,编译器会自动创建一个隐式接口变量。
  2. 当一个类实现了多个接口,并且在类的实现中只声明了其中一个接口变量时,编译器会自动创建其他未声明的接口变量。
  3. 当一个类继承了另一个类,并且父类实现了接口,子类在重写父类方法时,如果子类没有显式地声明接口变量,编译器会自动创建隐式接口变量。

隐式接口变量的创建使得类能够实现接口的方法,并且可以通过接口变量来调用这些方法。这样可以实现接口的多态性,提高代码的灵活性和可维护性。

在Delphi中,隐式接口变量的创建是编译器自动完成的,开发者无需手动创建或管理这些变量。编译器会根据类的实现和继承关系自动创建和管理接口变量的生命周期。

对于Delphi编译器创建隐式接口变量的更详细信息和示例,请参考腾讯云的Delphi开发文档:Delphi开发文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python动态强类型解释型语言原理解析

动态和静态 静态语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。例如:C++、Java、Delphi、C# 、go等。...强类型是指不允许变量类型转换,弱类型则允许类型转换。 所以,关键在于变量数据类型的转换。 什么叫类型转换?...是指源码中没有明显的类型转换代码,也就是说,一个变量,你可以直接给他赋值字符串,也可以直接给他赋值数值,你还可以直接让字符串类型的变量和数值类型的变量相加,虽然得出的最终结果未必是你想象的那样,但一定不会报错...这就是类型转换,弱类型语言,如javascript、php。 Java是强类型语言,不允许类型转换,也就是说,如果你需要拿一个字符串变量当做整型来用,你必须显地将变量类型转换好。...,语言的解析器会自动()转换。

1.6K30

C++ Primer ---类(读书笔记)

定义抽象数据类型 使用struct 或者class可以创建一个类,类里面包含成员变量,成员函数。...构造函数 类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些特殊的函数就是构造函数,构造函数的任务是初始化对象的数据成员,无论何时,只要类的对象被创建,就会执行构造函数。...如果类没有定义构造函数,编译器创建一个 合成的默认构造函数。如果有自定义的构造函数,则不会创建默认的构造函数。 note:只有当类没有声明任何构造函数时,编译器才会自动的生成默认构造函数。...可以将成员函数定义为内联函数,分为内联和显内联,内联是在类里面实现函数体,显内联是在类外面实现函数体,当然,类的内联成员函数也应该定义在类所在的头文件中。...我们编写程序的时候,如果要调用一个函数或者是变量编译器会去寻找所用名字的最佳匹配声明 现在名字当前块中寻找其声明语句,只考虑在名字使用之前的声明 如果没有找到,继续查找外层的作用域。

48720

C++中五花八门的初始化规则

总结 初始化的概念:创建变量时赋予它一个值(不同于赋值的概念) 类的构造函数控制其对象的初始化过程,无论何时只要类的对象被创建就会执行构造函数 如果对象未被用户指定初始值,那么这些变量会被执行默认初始化...,默认值取决于变量类型和定义变量的位置 无论何时只要类的对象被创建就会执行构造函数,通过显调用构造函数进行初始化被称为显初始化,否则叫做初始化 使用等号(=)初始化一个类变量执行的是拷贝初始化,...概念 无论何时只要类的对象被创建就会执行构造函数,通过显调用构造函数进行初始化被称为显初始化,否则叫做初始化。...只允许一步类型转换 编译器只会自动执行一步类型转换,如果地使用两种转换规则,那么编译器便会报错: class Cat { public: std::string name;...= Cat("tomocat"); } 直接初始化与拷贝初始化 如果使用等号(=)初始化一个类变量,实际上执行的是拷贝初始化,编译器把等号右侧的值拷贝到新创建的对象中区;如果不使用等号,那么执行的是直接初始化

2.5K10

Delphi XE5中的新增内容

Delphi XE5中的新特性 针对设备和仿真器的 Delphi Android ARM编译器 FM 平台用于创建针对Gingerbread (2.3.3 – 2.3.7)、Ice Cream Sandwich...,FireDAC 本地/嵌入远程企业连接到全方位的数据库 带有免费部署许可证的 IBLite嵌入数据库 Delphi XE5 包括了通过FireDAC、dbExpress和IBX的连接对SQLite...这里是添加在其他最近发布中的内容: Delphi XE4 Develop iOS应用 with Delphi iOS ARM编译器、工具链、全新的可视化开发环境和针对 iOS的控件 IBLite数据库可用于...XE2 针对Windows 的64位 Delphi编译器 FireMonkey应用平台 – 利用一个代码库创建多平台、多设备的应用 用FireMonkey创建Windows 和Mac OS X 桌面应用...XE2 针对Windows 的64位 Delphi编译器 FireMonkey应用平台 – 利用一个代码库创建多平台、多设备的应用 用FireMonkey创建Windows 和Mac OS X

2.2K40

Delphi 教程

虽然delphi是面向对象的,但是application是面向过程的,这是因为在程序刚建立的时候,是按顺序从上到下执行,此时还没有创建任何的对象,application是一个全局的过程变量....它的重要方法有以下几个: Initialize:对全局程序进行初始化.就比如说你有2个窗体,form1和form2,里面分别有1个全局变量,一般在人们的理解上,这些全局变量在form创建时才拥有实例...这是一个最简单的单元,它拥有单元名,接口部分,实现部分,最后用end.来结束。 接口部分用于进行定义,比如说类的定义,常量,变量定义,单元的引用,都能放在接口部分。...实现部分用于实现接口部分的类,也可以声明常量,变量或是引用单元,接口处引用和实现处引用的区别,就是接口引用没有类实例,而实现引用有类实例,并且接口处声明的常量,变量可被其他单元使用。...initialization部分,因为initialization是在单元载入前执行的,那个时候单元内的变量还未被创建

1.9K10

C# 学习笔记(16)—— 动态类型

动态类型简介 C# 是一门静态类型的语言,它在定义变量时要明确给出变量的类型。...当我们使用由dynamic关键字限制的变量时,编译器并不知道它的类型,该类型只能在程序运行时被确定。...这是因为在第 3 行,变量i的类型是动态类型,编译的具体类型只能在程序运行时被确定,编译器根本不知道其类型时什么,所以也就不会出现编译错误了 C# 为什么要引入动态类型 可以减少强制类型转换的使用 从上面代码示例可以看出引入动态类型的好处了...numbers.Take((int)number); 第二张是使用静态方法来调用扩展方法: var right2 = Enumerable.Take(numbers, numer); 委托与动态类型间不能做转换...不能将 Lambda 表达式定义为动态类型,因为它们之间不存在转换,如下面代码就会出现编译错误: dynamic lambdarestrict = x => x + 1; // 编译错误 如果硬要把

16210

C++类和对象(下)

,使得程序运行更加规范 ️转换 所谓转换就算编译器在看到赋值双方类型不匹配时,会将创建一个同类型的临时变量,将 = 左边的值拷贝给临时变量,再拷贝给 = 右边的值,比如: int a = 10;...; //实际上编译器优化的 编译器是这样认为的:构造临时变量+拷贝构造不如让我直接给你构造 这是编译器针对转换做出的优化行为 不难发现,这样的转换虽然方便,但会影响代码的可读性和规范性,我们可以通过关键字...explicit 限制转换行为 ️限制转换 在默认构造函数前加上explicit修饰 class A { public: //默认构造函数 //限制转换行为 explicit A(int...表示默认构造函数被调用过 cout << "A(int a = 0)" << endl; } private: int _a; }; 此时再次采用上面那种赋值方式会报错 A aa1 = 100; //报错,此时编译器无法进行类型转换...,优化也就不存在了 何时采用 explicit 修饰?

13920

C++-->类

面向对象封装是将数据和基于数据的操作封装成一个整体对象,对数据的访问或修改只能通过对象对外提供的接口进行。...5 类类型转换 5.1 只含单个形参的构造函数能够实现从形参类型到该类类型的一个转换 class A { public: A(int a) { ia...5.2抑制由构造函数定义的转换 通过将构造函数声明为 explicit,来防止在需要转换的上下文中使用构造函数: class A { public: explicit A(int...而另一些类在创建新对象时必须做一些特定工作。这两种情况下,都必须定义自己的复制构造函数。 最好显定义默认构造函数和复制构造函数。如果定义了复制构造函数,必须定义默认构造函数。...(1) 何时调用析构函数 撤销(销毁)类对象时会自动调用析构函数。 变量(类对象)在超出作用域时应该自动撤销(销毁)。

71430

【笔记】《Effective C++》条款26-55

41 了解接口和编译期多态 普通编程的时候一个类所需的都是显接口(类头文件声明的接口)和运行期多态(继承而来的接口), 多数都是我们可控的 模板编程的时候我们看不到模板参数具体的头文件声明(因为模板参数本身是未定的..., 在编译期才被具现化出来), 需要的是接口(参数被传入模板后受到模板中的调用)和编译期多态(不同模板参数具象化出不同的模板导致了调用不同的接口), 很难把握 接口并不基于函数签名决定, 而是按照模板内的表达式决定..., 我们提前进行的设计需要尽量满足表达式的输入和返回的类型 不管是显接口还是接口, 都在编译期完成检查, 因此我们都要好好检查, 可能被传入模板的类型到底能不能满足模板的接口 42 了解typename..., 编译器才会开始编译 当然如果传入参数有误编译器依然会报错 任何时候想要在模板中使用一个嵌套从属名称时都需要以上处理, 包括参数列中....这类的转换的接口形如下图: 46 需要类型转换的时候请为模板定义非成员函数 模板函数进行实参推导的过程中不会自动考虑模板函数的类型转换, 因为从一开始编译器就看不见这个目标转换函数 如果想要写一个可以处理模板类的函数

89030

Scala教程之:可扩展的scala

Scala是扩展的,Scala提供了一种独特的语言机制来实现这种功能: 类:允许给已有的类型添加扩展方法 字符串插值:可以让用户使用自定义的插值器进行扩展 类是在scala 2.10中引入的...,类指的是用implicit关键字修饰的类。...在对应的作用域内,带有这个关键字的类的主构造函数可用于转换。...在同一作用域内,不能有任何方法、成员或对象与类同名,注意:这意味着类不能是case class。 object Bar implicit class Bar(x: Int) // 错误!...任何时编译器遇到一个如下形式的字符串字面值:id"string content" 它都会被转换成一个StringContext实例的call(id)方法。这个方法在范围内仍可用。

1.2K10

《Effective C++》学习笔记

有显转换方法(如指针的->和(*)操作,也比如自制一个getXXX()函数),还有转换方法(比如覆写XXX()取值函数)。显操作比较安全,操作比较方便(但容易被误用)。...模板与泛型编程 条款41:了解接口和编译期多态 类和模板都支持接口和多态。 类的接口是显定义的——函数签名。多态是通过虚函数在运行期体现的。...模板的接口的(由模板函数的实现代码所决定其模板对象需要支持哪些接口),多态通过模板具现化和函数重载解析在编译期体现,也就是编译期就可以赋予不同的对象于模板函数。...条款46:需要类型转换时请为模板定义非成员函数 模板类中的模板函数不支持类型转换,如果你在调用时传了一个其他类型的变量编译器无法帮你做类型转换,从而报错。...解决方案是将该模板函数定义为模板类内的友元模板函数,从而支持了参数的转换。

1.1K20

SystemVerilog(七)-网络

input or inout端口 与模块实例或接口实例的端口或基本实例的终端的连接 连续赋值语句的左侧 默认情况下,推断的网络类型为网络wire类型。...网络的向量大小基于本地上下文。如果网络是从模块端口声明推断出来的,那么网络的向量大小将是端口的大小。如果从与模块、接口或例化实例的连接推断网络,则将推断标量网络。...示例3-1说明了几个网络声明。 示例3-1:创建网络的未声明标识符示例 上面还涉及到dot-name 和 dot-star的使用,这将在后面介绍。 更改默认的网络类型。...可以使用编译器指令: 'default_nettype 更改网络类型。每当推断出网络时,在指令之后编译的所有SystemVerilog代码都将使用指定的网络类型。'...网络可以减少编写网表模型所需的时间,并减少键入错误。 但是,网络的一个缺点是,与模块、接口或例化实例的连接中拼写错误的名称不会被检测为连接错误。

1.3K40

Scala

6、转换 转换(implicit conversion)是指在 Scala 编程中,可以定义一些的方法或函数,使得编译器在需要某种类型的实例时,自动地将另外一种类型的实例进行转换。...通过定义一些转换,我们可以让编译器自动地将一些常见的类型转换或者操作转换成我们期望的结果,从而让代码更加简洁和易于理解。...当编译器发现类型不匹配时,会自动地查找可用的转换函数或者类来进行类型转换。   需要注意的是,转换的滥用可能会导致代码难以理解和维护。...由于我们已经定义了一个 Double 类型的类 DistanceOps,编译器会自动地将 Double 类型的值进行转换,从而让我们可以使用 distanceTo 方法: val p1 = Point...8、scala和java 的区别   1、变量声明:   scala:只需要申明是val或是var,具体的类型(比如String,Int,Double等等)由编译器⾃行推断   java: 需要在变量

17130

var lady first

在大部分情况下使用 var 声明类型的变量编译器会自动选择合适的类型来处理。...这里我需要强调的是类型变量的真实类型是由方法的签名决定的,也就是说不管这个类型的真实类型是从某个类继承的类还是实现了一个或多个接口的类,只要没有明确执行类型转换,编译器都会根据方法的签名来决定类型的真实类型...上面我们说了类型的优点,那么我们再来说一下类型的缺点。...这是因为 var 声明的变量编译器会自动推断其类型,但是开发人员看不到推断出来的类型。其次,如果使用类型的变量的真实类型是内置的数值类型的话会产生类型转换精度下降的问题。...这个问题并不是编译器问题,而是因为编译器会自己设定变量的类型,也就是说根据赋值符号等号右侧的部分做出的最佳选择。 Tip: 这里指的类型变量是指局部变量

84720

C# 学习笔记(11)—— C# 的春天

之所以可以这样定义,主要是因为编译器在编译时会帮我们创建一个私有字段 类型 C# 是强类型语言,在定义一个变量时,需要声明变量的类型。然而类型长度如果过长,就可能会影响代码的可读性。...C# 3.0 引入类型,即可以使用关键字 var 来声明变量或者数组,var 关键字告诉编译器去根据变量的值来推断其类型 类型的局部变量 下面来看 var 关键字如何声明局部变量,具体演示代码如下...并且变量仍然是静态类型,只是你在代码没写出来而已,这个工作交给了编译器,它会根据变量的值去推断类型 使用类型时有一些限制,包括以下几点: 被声明的变量时一个局部类型,不能位字段(包括静态字段和实例字段...C# 是静态语言,变量类型位置就会出现编译时错误 变量不能初始化为 null,因为 null 可以地转换为任何引用类型或可空类型,编译器将不能推断出该变量到底为什么类型 不能用 var 来声明方法中的参数...类型数组 使用 var 关键字不仅可以创建类型局部变量,还可以创建数组,例如下面这段代码 class Program { static void Main(string[] args)

14710

C++程序员转向C#时的十大陷阱

当然,你也就失去了对何时销毁对象的精确控制。实际上,C#中没有显的析构器。 如果你在处理一个未受管制的资源,当你用完时,你需要显地释放那些资源。...资源的控制可通过提供一个Finalize方法(称为终结器),当对象被销毁时,它将被垃圾收集器调用。 终结器只应该释放对象携带的未受管制的资源,而且也不应该引用别的对象。...类和接口创建引用类型,但要谨记(参见陷阱五):和所有固有类型一样,结构也是值类型。 【译注:可参见陷阱五的例子】 陷阱4.警惕装箱 装箱和拆箱是使值类型(如整型等)能够象引用类型一样被处理的过程。...C#里的每一种类型包括固有类型都是从object派生下来并可以被转换为object。装箱一个值相当于创建一个object的实例,并将该值拷贝入该对象。...装箱是进行的,因此,当需要一个引用类型而你提供了一个值类型时,该值将会被装箱。装箱带来了一些执行负担,因此,要尽可能地避免装箱,特别是在一个大的集合里。

2.1K10

《Effective C++》读书摘要

二、const、enum、inline替换#define const:代替宏变量有助于编译器理解; enum:enum hack,更像define,不消耗内存,无法取地址; inline:宏函数尽量用inline...十五、资源管理类提供原始资源访问 原始资源获取; 转换——类型转换函数。 十六、new-delete同型成对 []的出现与否要对应起来,即使使用了typedef重命名了数组类型。...(五)、实现 二十六、延后变量定义 不要提前定义,直到使用改变量的前一刻为之; 针对循环内的对象需要根据构造析构与赋值的成本,以及可维护性进行权衡。...三十、inline里里外外 :累内直接定义成(友)员函数,显:inline关键字; 拒绝:复杂、虚函数、函数指针调用、模板、构造析构函数、影响动态连接或升级、对调试器的挑战(禁用)。...(七)、模板与泛型编程 四十一、接口与编译多态 class是显示接口——函数签名,运行多态——虚函数; template是接口——有效表达式,编译多态——模板具体化与函数重载解析。

1.9K60

拷贝初始化与直接初始化

总结 初始化值的是创建变量时赋予变量一个值(不同于赋值的概念) 使用等号=初始化对象时是拷贝初始化,否则是直接初始化 直接初始化也可能调用拷贝构造函数,拷贝初始化可以不调用拷贝构造函数 初始化概念 对象是类的实例化...初始化指的就是创建变量是赋予它一个值(不同于赋值的概念),类的构造函数控制其对象的初始化过程,无论何时只要类的对象被创建就会执行构造函数。...拷贝初始化与直接初始化 C++由于历史原因包含多种不同的初始化方式,我们可以简单地认为:如果使用等号=初始化变量则执行的是拷贝初始化(编译器将等号右边的对象值拷贝到新创建的对象中去),不使用等号时使用的是直接初始化...),实际上是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数(当然也包括拷贝构造函数),当我们使用拷贝初始化时(使用=初始化变量),我们要求编译器将右侧运算对象的值拷贝到正在创建的对象中...this; } std::string name; }; 几种常用的初始化实现方式如下: int main(void) { // 拷贝初始化: 执行std::string到Cat的类型转换

1.5K20

C++避坑指南

3.1 转换 C++自定义类型在以下两种情况会发生转换: 1) 类构造函数只有一个参数或除第一个参数外其他参数有默认值; 2) 类实现了operator type()函数;...operator int()函数可以将Integer类型转换为int。从下面代码和输出中可以看出确实发生了的类型转换。...这也是std::string不提提供const char *转换而专门提供了c_str()函数显示转换的原因。...3.2 显示转换 正是由于转换存在的坑,C++提供explicit关键字来阻止转换,只能进行显示转换,分别作用域构造函数和operator(),如下所示: 1) explicit Ctor(const...内联有以下几个主要特点: a、内联可以发生在任何时机,包括编译期、链接期、运行时等; b、编译器很无情,即使你加了inline,它也可能拒绝你的inline; c、编译器很多情,即使你没有加inline

1.5K30
领券