Dart(十一):类和对象

Dart是一门使用类和单继承的面向对象语言
所有的对象都是类的实例,并且所有的类都是Object的子类

1、定义

类的定义用class关键字
如果未显式定义构造函数,会默认一个空的构造函数
使用new关键字和构造函数来创建对象

void main() {
  var point = new Point();
  //未定义父类的时候,默认继承自Object
  print(point.hashCode);
  
}

class Point {
  num x;
  num y;
  num z;
}

2、构造函数

如果只是简单的参数传递,可以在构造函数的参数前加this关键字定义
或者参数后加:再赋值

void main() {
  var p1 = new Point(3, 4, 5);
  var p2 = new Point.fromeList([3,4,5]);
  print(p1);
  
}

class Point {
  num x;
  num y;
  num z;
  Point(this.x, this.y, z){
    // //第一个值传递给this.x,第二个值传递给this.y
  }
  // //命名构造函数,格式为Class.name(var param)
  Point.fromeList(var list):this(list[0],list[1],list[2]);

  String toString() => 'x:$x  y:$y   z:$z';

}

如果你要创建一个不可变的对象,你可以定义编译时常量对象
需要在构造函数前加const

class ImmutablePoint {
    final num x;
    final num y;
    const ImmutablePoint(this.x, this.y); // 常量构造函数
    static final ImmutablePoint origin = const ImmutablePoint(0, 0); // 创建一个常量对象不能用new,要用const
}

3、Getters And Setters

Getter和Setter是用来读写一个对象属性的方法
每个属性字段都对应一个隐式的Getter和Setter
但是调用的时候是obj.x,而不是obj.x()

你可以使用getset关键字扩展功能
如果字段为final或者const的话,那么它只有一个getter方法

void main() {

  //
  var rect = new Rectangle(3, 4, 20, 15);
  assert(rect.left == 3);
  rect.right = 12;
  assert(rect.left == -8);
  
}

class Rectangle{
  num left;
  num top;
  num width;
  num height;

  Rectangle(this.left, this.top, this.width, this.height);

  // right  bottom 两个属性的计算方法
  num get right => left + width;
  set right (num value) => left = value - width;
  num get bottom => top + height;
  set bottom(num value) => top = value -height;

}

4、抽象类

在Dart中类和接口是统一的,类就是接口
如果你想重写部分功能,那么你可以继承一个类
如果你想实现某些功能,那么你也可以实现一个类

使用abstract关键字来定义抽象类,并且抽象类不能被实例化
抽象方法不需要关键字,直接以分号 ; 结束即可


void main() {

  //
}

// 定义了一个 Shape 类/接口
abstract class Shape {
  // 这是一个抽象方法,不需要abstract关键字,是隐式接口的一部分
  num perimeter();
}

// Rectangle 实现了 Shape 接口
class Rectangle implements Shape {
  final num height, width;
  Rectangle(num this.height, num this.width);
  // 实现了 Shape 接口要求的 perimeter 方法
  num perimeter() => 2*height + 2 * width;

}

// Square 继承 Rectangle
class Square extends Rectangle {
  Square(num size) : super(size, size);
}

5、工厂构造函数

Factory单独拿出来讲,因为这不仅仅是构造函数,更是一种模式
有时候为了返回一个之前已经创建的缓存对象,原始的构造方法已经不能满足要求
那么可以使用工厂模式来定义构造函数
并且用关键字new来获取之前已经创建的缓存对象

class Logger { 
    final String name; 
    bool mute = false; 
    
    // 变量前加下划线表示私有属性 
    static final Map<String, Logger> _cache = <String, Logger>{}; 
    
    factory Logger(String name) { 
        if (_cache.containsKey(name)) { 
            return _cache[name]; 
        } else { 
            final logger = new Logger._internal(name); 
            _cache[name] = logger; 
            return logger; 
        } 
    }

    Logger._internal(this.name); 
    
    void log(String msg) { 
        if (!mute) { 
            print(msg); 
        } 
    } 
} 

var logger = new Logger('UI'); 
logger.log('Button clicked');

  • 补充一下实现和继承

实现的关键字为implements
继承的关键字为extends

abstract class Person {  //此时abstract关键字可加可不加,如果加上的话Person不能被实例化 
    String greet(who); //函数可以没有实现语句,名曰隐式接口,前面不用加 abstract 关键字 
}

当使用 implements的时候,子类Student无法访问父类Person的参数
所以变量name放到了Student
如果生成了一个Student的实例,调用了某函数,那么Student中必须有那个函数的实现语句,无论Person是否实现

class Student implements Person { 
    String name; 
    Student(this.name); 
     
    String greet(who) => 'Student: I am $name!'; 
} 

class Teacher implements Person { 
    String name; 
    Teacher(this.name); 
   
    String greet(who) => 'Teacher: I am $name!'; 
} 

void main() { 
    Person student = new Student('Wang'); 
    Person teacher = new Teacher('Lee'); 
    
    print( student.greet('Chen')); 
    print(teacher.greet('Chen')); 
}

我感觉用implements的时候,父类就感觉是C++中的纯虚函数
可以试一下把Person前的abstract关键字去掉
然后添加构造函数和方法,对Student和Teacher没有影响
但那样的话Student和Teacher的name变量仍然不能省略,那样感觉就冗余了
根据您自己的情况修改吧!
总之,implements可以是实现多个类的多个函数

相比之下继承就好理解得多
Dart中是单继承,子类可以继承父类的非私有变量
当重写某个函数的时候
不用考虑abstract或者接口或者函数实现
直接重写,比如greet()函数
而且仍然保持多态性

class Person { 
  String name; 
   
  Person(this.name); 
  String greet(who) => 'I am $name!'; 
} 

class Student extends Person {   
  Student(String name):super(name); 
  String greet(who) => 'Student: I am $name!'; 
} 

class Teacher extends Person { 
  Teacher(String name):super(name); 
     String greet(who) => 'Teacher: I am $name!'; 
} 

void main() { 
   Person p1 = new Student('Wang'); 
   Person p2 = new Teacher('Lee'); 
    
   print(p1.greet('Chen')); 
   print(p2.greet('Chen')); 
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,650评论 0 11
  • 几家欢喜,几家愁。 我有位好友,没有考上三笔,也没有考上二笔,过程太艰辛,但是经过了这么多努力,他考上了高翻。是考...
    brekker阅读 117评论 0 0
  • 深夜不睡。问你在干嘛,说不出来。好像刷刷手机就是一天的爱好了。看着大家认真读书,认真的过每一天。而自己却是天天抱着...
    马大菜才不菜阅读 257评论 1 1
  • 以前不喜欢吃的东西,如苦瓜、西红柿、红枣煮鸡蛋等。现在爱吃了。 以前活得糙一些,不会在意脸上有啥变化,头发掉的多少...
    喝水的木土土阅读 219评论 0 0