ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[dart学习]第七篇:类(构造函数)

2019-07-08 10:50:50  阅读:195  来源: 互联网

标签:Point Person dart 第七篇 num var 父类 构造函数


前言:楼主平时基本没有使用过异常处理,所以对异常的认知可能不够准确,这里就不翻译异常的相关内容了,大家可以去官网自行阅读介绍,地址 https://dart.dev/guides/language/language-tour#exceptions

我们前面提到,dart是面向对象的语言,程序中的每个对象都可以看作是某个类的实例。所有的类都派生自Object类。

(一)使用类的成员

与C++等面向对象语言一样,dart的类成员包括方法(接口)与数据,使用点号操作符(.)可以访问类的方法和数据。看个简单例子:

//实例化Point类的一个对象,命名为p
var p = Point(2, 2);

// 设置类的成员y的值.
p.y = 3;

// 获取成员y的值
assert(p.y == 3);

// 调用类的distanceTo方法
num distance = p.distanceTo(Point(4, 4));

一个小技巧: 使用 ?. 可以避免访问一个空实例,如下例:

// If p is non-null, set its y value to 4.
p?.y = 4;

(二)构造器

了解C++的朋友都知道,在C++中类一定有构造函数,dart也是如此。

在dart中使用构造器创建一个对象,构造器可以是ClassName or ClassName.identifier,看以下例子:

// 使用 ClassName 创建
var p1 = Point(2, 2);
// 使用 ClassName.identifier 创建
var p2 = Point.fromJson({'x': 1, 'y': 2});

也可以使用 new 关键字创建,如下:

var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

以上两段代码的效果是一样的。

(题外话:在C++中使用new创建的是指针,在这里我们看到,以上两段代码返回都是var类型)

可以使用const关键字创建编译时常量的对象,简单例子:

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);

assert(identical(a, b)); // They are the same instance!

接着再看如下例子:

var a = const ImmutablePoint(1, 1); // Creates a constant
var b = ImmutablePoint(1, 1); // Does NOT create a constant

assert(!identical(a, b)); // NOT the same instance!

通过以上两段代码我们可以看出:即便构造器调用参数完全相同,const和非const对象也是不等同的。

(三)获取一个对象的类型

可以调用对象的 runtimeType 属性获取对象的运行时数据类型, 该属性是 Type 类型的对象。

print('The type of a is ${a.runtimeType}');

(四)实例变量

先看一个例子:

class Point {
  num x;        // 声明实例变量x
  num y = 2;  // 声明实例变量y
}
void main()
{
  var p = Point();        // 构造Point类的实例p
  print("y = ${p.y}");
  if(p.x == null)
  {
    print("p.x == null");
  }
  else
  {
    print("eeee");
  }
}    

代码运行结果

通过上例我们可以看出:类中的变量默认被初始化为null,如果我们在类声明时对变量进行了初始化(如Point类中的y),则该初始化赋值发生在调用构造函数之前

(五)构造函数

我们可以通过声明一个与类名完全相同的函数来声明构造函数(和C++一样),当然,也可以选择附加标识符,如 (二)构造器 一段所述。看个例子:

class Point {
  num x, y;

  Point(num x, num y) {
    // There's a better way to do this, stay tuned.
    this.x = x;
    this.y = y;
  }
}

 这里的this关键字指当前实例自身,另注:只在名字有冲突的时候才适用this关键字,否则可以省略。

(1)默认构造函数

前面已经提到,和C++一样,如果你没有声明自己的构造函数,那么编译器会给你提供一个默认的构造函数,默认构造函数无入参,并且调用父类的无参构造函数。

(2)构造函数不能继承

子类不能继承父类的构造函数。前面提到,子类如果没有声明构造函数,那么会有默认的构造函数,而不是集成父类的。

(3) 命名构造函数 (Named constructor)

看个例子:

class Point {
  num x, y;

  Point(this.x, this.y);

  // Named constructor
  Point.origin() {
    x = 0;
    y = 0;
  }
}

记住,构造函数不能继承!如果想用父类中的命名构造函数创建一个子类,那你也必须在子类中实现这个命名构造函数!

(4) 构造函数的调用顺序

子类的构造函数中执行的操作顺序如下:

初始化列表->父类的无参构造函数->本类的无参构造函数。

如果父类没有非命名、无参数的构造函数,那么你就必须手动调用父类的一个构造函数,在分号(:)后指明调用的父类构造函数,看以下例子:

class Person {
  String firstName;

  Person.fromJson(Map data) {
    print('in Person Class');
  }
}

class Employee extends Person {
  // Person does not have a default constructor;
  // you must call super.fromJson(data).
  Employee.fromJson(Map data) : super.fromJson(data) {
    print('in Employee Class');
  }
}

main() {
  var emp = new Employee.fromJson({});

  // Prints:
  // in Person Class
  // in Employee Class
  if (emp is Person) {
    // Type check
    emp.firstName = 'Bob';
    print("emp is Person, firstname = ${emp.firstName}");
  }
  (emp as Person).firstName = 'Bob';
  print("Other,firstname = ${emp.firstName}");
}

以上代码在vs code中运行结果如下:

父类构造函数的参数中无权限使用this关键字!

(5) 重定向构造函数

这个重定向构造函数,个人理解有一点点像C++里虚基的构造函数,重定向构造函数函数体为空,仅仅是在该类里用来重定向其他的构造函数的。看一个例子:

class Point {
  num x, y;

  // Point类的主构造函数,也是一个重定向构造函数,你看它的函数体是空的
  Point(this.x, this.y);

  // alongXAxis函数被重定向到Point执行构造处理
  Point.alongXAxis(num x) : this(x, 0);
}

(6)其他

官方对于构造函数还有一些其他类型的描述,如constant构造、factory构造等,本人对此不甚理解,因此这里就不做翻译,大家有兴趣请去官网阅读相关说明。

 

标签:Point,Person,dart,第七篇,num,var,父类,构造函数
来源: https://www.cnblogs.com/gklovexixi/p/11101952.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有