美文网首页
函数与类

函数与类

作者: 星空WU | 来源:发表于2021-01-19 14:07 被阅读0次

    Dart 是一门真正面向对象的语言, 甚至其中的函数也是对象,并且有它的类型 Function 。 这也意味着函数可以被赋值给变量或者作为参数传递给其他函数。 也可以把 Dart 类的实例当做方法来调用。

    bool isNoble(int atomicNumber) 

{

        //return _nobleGases[atomicNumber] != null;

  }

如果函数中只有一句表达式,可以使用简写语法

=> expr 语法是 { return expr; } 的简写。 => 符号 有时也被称为 箭头 语法。在箭头 (=>) 和分号 (;) 之间只能使用一个 表达式 ,不能是 语句 。 例如:不能使用 if 语句 ,但是可以是用 条件表达式.

可选参数

    可选参数可以是命名参数或者位置参数,但一个参数只能选择其中一种方式修饰

定义函数时,使用 {param1, param2, …} 来指定命名参数:

    Flutter 创建实例的表达式可能很复杂, 因此窗口小部件构造函数仅使用命名参数。 这样创建实例的表达式更易于阅读。使用 @required 注释表示参数是 required 性质的命名参数。

位置可选参数

将参数放到 [] 中来标记参数是可选的:

默认参数值

    在定义方法的时候,可以使用 = 来定义可选参数的默认值。 默认值只能是编译时常量。 如果没有提供默认值,则默认值为 null。

    下面是设置可选参数默认值示例:

下面示例演示了如何为位置参数设置默认值:

list 或 map 可以作为默认值传递。 下面的示例定义了一个方法 doStuff(), 并分别指定参数 list 和 gifts 的默认值。

main() 函数

    任何应用都必须有一个顶级 main() 函数,作为应用服务的入口。 main() 函数返回值为空,参数为一个可选的 List<String> 。

    函数是一等对象。

一个函数可以作为另一个函数的参数;

同样可以将一个函数赋值给一个变量。

匿名函数

    多数函数是有名字的, 比如 main() 和 printElement()。 也可以创建没有名字的函数,这种函数被称为 匿名函数, 有时候也被称为 lambda 或者 closure 。 匿名函数可以赋值到一个变量中, 举个例子,在一个集合中可以添加或者删除一个匿名函数。

    下面例子中定义了一个包含一个无类型参数 item 的匿名函数。 list 中的每个元素都会调用这个函数,打印元素位置和值的字符串。

闭包

闭包 即一个函数对象,即使函数对象的调用在它原始作用域之外, 依然能够访问在它词法作用域内的变量

其中num 是数字类型的父类,有两个子类 int 和 double.

声明实例变量的示例,

如果在声明时进行了示例变量的初始化, 那么初始化值会在示例创建时赋值给变量, 该赋值过程在构造函数及其初始化列表执行之前。

构造函数

通过创建一个与其类同名的函数来声明构造函数 ,仅当存在命名冲突时,使用 this 关键字。 否则,按照 Dart 风格应该省略 this

通常模式下,会将构造函数传入的参数的值赋值给对应的实例变量, Dart 自身的语法糖精简了这些代码:

//默认构造函数

//在没有声明构造函数的情况下, Dart 会提供一个默认的构造函数。 默认构造函数没有参数并会调用父类的无参构造函数。

//构造函数不被继承

//子类不会继承父类的构造函数。 子类不声明构造函数,那么它就只有默认构造函数 (匿名,没有参数) 。

//命名构造函数

//使用命名构造函数可为一个类实现多个构造函数, 也可以使用命名构造函数来更清晰的表明函数意图:

切记,构造函数不能够被继承, 这意味着父类的命名构造函数不会被子类继承。 如果希望使用父类中定义的命名构造函数创建子类, 就必须在子类中实现该构造函数。

    以上类的运行例子:

调用父类非默认构造函数

    默认情况下,子类的构造函数会自动调用父类的默认构造函数(匿名,无参数)。 父类的构造函数在子类构造函数体开始执行的位置被调用。 如果提供了一个 initializer list (初始化参数列表), 则初始化参数列表在父类构造函数执行之前执行。 总之,执行顺序如下:

* 1 初始化参数列表)

* 2、父类的无名构造函数)

* 3、主类的无名构造函数)

* 如果父类中没有匿名无参的构造函数, 则需要手工调用父类的其他构造函数。 在当前构造函数冒号 (:) 之后,函数体之前,声明调用父类构造函数。

初始化列表

  * 除了调用超类构造函数之外, 还可以在构造函数体执行之前初始化实例变量。 各参数的初始化用逗号分隔; 初始化程序的右侧无法访问 this 。

重定向构造函数

* 有时构造函数的唯一目的是重定向到同一个类中的另一个构造函数。 重定向构造函数的函数体为空, 构造函数的调用在冒号 (:) 之后。

常量构造函数

* 常量构造函数需以const关键字修饰

* const构造函数必须用于成员变量都是final的类

* 构建常量实例必须使用定义的常量构造函数

* 使用常量构造函数构造的实例前也必须加const修饰

* 如果构造函数不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例.

工厂构造函数

    当执行构造函数并不总是创建这个类的一个新实例时,则使用 factory 关键字;

工厂构造函数无法访问this

方法

方法是为对象提供行为的函数。

实例方法,对象的实例方法可以访问 this 和实例变量。

Getter 和 Setter

Getter 和 Setter 是用于对象属性读和写的特殊方法。 回想之前的例子,每个实例变量都有一个隐式 Getter ,通常情况下还会有一个 Setter 。 使用 get 和 set 关键字实现 Getter 和 Setter ,能够为实例创建额外的属性。

抽象方法

    实例方法, getter, 和 setter 方法可以是抽象的, 只定义接口不进行实现,而是留给其他类去实现。 抽象方法只存在于 抽象类 中。

    定义一个抽象函数,使用分号 (;) 来代替函数体:

抽象类

    使用 abstract 修饰符来定义 抽象类 — 抽象类不能实例化。 抽象类通常用来定义接口,以及部分实现。 如果希望抽象类能够被实例化,那么可以通过定义一个 工厂构造函数 来实现。

隐式接口

    每个类都隐式的定义了一个接口,接口包含了该类所有的实例成员及其实现的接口。 如果要创建一个 A 类,A 要支持 B 类的 API ,但是不需要继承 B 的实现, 那么可以通过 A 实现 B 的接口。

    

一个类可以通过 implements 关键字来实现一个或者多个接口, 并实现每个接口要求的 API。

扩展类(继承)

使用 extends 关键字来创建子类, 使用 super 关键字来引用父类。

重写类成员

子类可以重写实例方法,getter 和 setter。 可以使用 @override 注解指出想要重写的成员:

相关文章

  • ES6面向对象

    类声明与构造函数 class 声明类constructor 构造函数 继承与超类

  • python编码规范(三)--空行,换行,缩进

    1.空行 空一行:用于类成员函数之间,或者用于区分不同逻辑块 空两行:类与类,类与函数,函数与函数之间 2.换行 ...

  • React函数组件与类组件

    函数组件与类组件 GitHub地址 函数组件与类组件函数组件(functional component)类组件(c...

  • 【Dart】Dart类与对象

    类与对象 类 继承 抽象类 接口 混入 泛型 枚举类类-简介 构造器 (构造函数) 默认构造函数与类同名的函数,在...

  • C++基础构造函数(constructor)

    构造函数定义 C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数,构造函数在定义时...

  • [初学C++]构造和析构函数

    什么是构造函数定义C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数.C++对类提...

  • 析构函数

    value类与handle类析构函数的区别 value类 value类没有析构函数,自己定义的delete函数不会...

  • Power BI-DAX公式常用函数套路

    一.筛选类函数 二.逻辑与逻辑判断函数 三.时间日期类函数 统计聚合函数 四.文本函数

  • 函数与类

    Dart 是一门真正面向对象的语言, 甚至其中的函数也是对象,并且有它的类型 Function 。 这也意味着函数...

  • C#魔帅-lesson_01-类

    类的定义 构造函数 类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行。构造函数的名称与类的名称完全...

网友评论

      本文标题:函数与类

      本文链接:https://www.haomeiwen.com/subject/dngaaktx.html