类、抽象类、接口、混入

Flutter 中的三种关系:

  • 1、继承(关键字 extends
  • 2、混入 mixins (关键字 with
  • 3、接口实现(关键字 implements
  • 这三种关系可以同时存在,但是有前后顺序:extends -> mixins -> implements。extens在前,mixins在中间,implements最后。

  • Dart所有的东西都是对象,所有的对象都继承自Object类。
  • Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。
构造函数
默认构造函数
  • dart的默认构造函数只能有一个,由类名+(参数s){}构成Person(String name,int age){this.name = name; this.age = age;}
  • 默认构造函数简写格式为类名+(接收参数的属性s)Person(this.name, this.age);// 将接收到的第一个参数赋值给this.name,接收到的第二个参数,赋值给this.age,等同于上面的Person(String name,int age){this.name = name; this.age = age;}
命名构造函数
  • dart 中命名构造函数可以有多个
  • 命名构造函数格式为类名.函数名(参数s) { }Person.student(){函数体}。使用命名构造函数生成一个实例:Person p = new Person.student();
Dart中的私有属性和方法
  • dart中没有public、private、protected访问修饰符
  • dart中使用下划线(_)将一个属性或者方法变为私有。需要注意的是加了下划线的私有属性或者方法依然可以被当前文件中的其他类访问,只是不能被别的文件中的模块访问。如果需要只能当前类访问,需要将该类放到一个单独的文件中
getter 和 setter
class Rect{
  num height;
  num width; 
  //Rect(this.height,this.width);
  Rect():height=2,width=10{//在构造函数体运行之前初始化实例变量
    
  }
  get area{
    return this.height*this.width;
  }
  set areaHeight(value){
    this.height=value;
  }
}
静态成员和静态方法
  • dart中使用static关键字来实现类级别的变量和函数
  • 静态方法不能访问非静态成员,非静态成员方法可以访问静态成员
class Person {
  static String name = '张三';
  int age=20;
  static void show() {
    print(name);
  }
  void printInfo(){  /*非静态方法可以访问静态成员以及非静态成员*/
      print(name);  //访问静态属性
      print(this.age);  //访问非静态属性
      show();   //调用静态方法
  }
  static void printUserInfo(){//静态方法
        print(name);   //静态属性
        show();        //静态方法
        // print(this.age);     //静态方法没法访问非静态的属性 报错
        // this.printInfo();   //静态方法没法访问非静态的方法 报错
        // printInfo();        //静态方法没发访问非静态的方法  报错
        Person p = Person();
        p.printInfo();
  }
}

继承

  • 子类使用extends关键词来继承父类
  • 子类会继承父类里面可见的属性和方法 但是不会继承构造函数(默认构造函数和命名构造函数)
  • 子类能复写父类的方法 getter和setter
  • 子类重写父类方法时用@override关键字,默认不用也可以,一般建议使用
  • 子类中使用super关键字调用父类方法
class Person {
  String name;
  num age; 
  Person(this.name,this.age);
  void printInfo() {
    print("${this.name}---${this.age}");  
  }
}
class Web extends Person{
  Web(String name, num age) : super(name, age){ //子类实现自己的构造方法,同时调用父类的构造方法
  }
}

抽象类

  • Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
  • 抽象类通过abstract 关键字来定义
  • Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。
  • 如果子类继承抽象类必须得实现里面的抽象方法
  • 如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。
  • 抽象类不能被实例化,只有继承它的子类可以
extends抽象类 和 implements的区别:
  • 如果要复用抽象类里面的方法,并且要用抽象方法约束自类的话我们就用extends继承抽象类
  • 如果只是把抽象类当做标准的话我们就用implements实现抽象类
abstract class Animal{
  eat();   //抽象方法
  run();  //抽象方法  
  printInfo(){
    print('我是一个抽象类里面的普通方法');
  }
}
class Dog extends Animal{
  @override
  eat() {
     print('小狗在吃骨头');
  }
  @override
  run() {
    print('小狗在跑');
  }  
}
class Cat extends Animal{
  @override
  eat() {
    print('小猫在吃老鼠');
  }
  @override
  run() {
    print('小猫在跑');
  }
}
Dart 中的多态
  • 允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。
  • 子类的实例赋值给父类的引用。
  • 多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。
Dart中的接口
  • dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
  • 使用implements关键字进行实现
  • 如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。因为抽象类可以定义抽象方法,普通类不可以.

Dart 中的接口

  • 一个类实现多个接口
abstract class A{
  String name;
  printA();
}
abstract class B{
  printB();
}
class C implements A,B{  
  @override
  String name;  
  @override
  printA() {
    print('printA');
  }
  @override
  printB() {
    return null;
  }
}
Dart 中的混入
  • mixins意思是混入,就是在类中混入其他功能。
  • 在Dart中可以使用mixins实现类似多继承的功能
  • mixins使用的条件,随着Dart版本一直在变,这里说的是Dart2.x中使用mixins的条件:
    1、作为mixins的类只能继承自Object,不能继承其他类
    2、作为mixins的类不能有构造函数
    3、一个类可以mixins多个mixins类
    4、mixins绝不是继承,也不是接口,而是一种全新的特性
class Person{
  String name;
  num age;
  Person(this.name,this.age);
  printInfo(){print('${this.name}----${this.age}');}
  void run(){print("Person Run");}
}
class A {
  String info="this is A";
  void printA(){ print("A");}
  void run(){print("run")}
}
class B {  
  void printB(){print("B");}
  void run(){print("B Run");}
}
class C extends Person with B,A{
  C(String name, num age) : super(name, age);
  
}

  • mixins的类型就是其超类的子类型。
class A {
  String info="this is A";
  void printA(){
    print("A");
  }
}
class B {
  void printB(){
    print("B");
  }
}
class C with A,B{
  
}
void main(){  
  var c=new C();   
  print(c is C);    //true
  print(c is A);    //true
  print(c is B);   //true
}
  • 抽象类
    抽象方法:在Dart中没有具体实现的方法(没有方法体),就是抽象方法,抽象方法必须存在于抽象类中
    抽象类里的方法可以有实现,也可以仅仅声明
    抽象类使用abstract声明
    external 的作用: 可以是方法的声明和实现分离,这样多的好处是可以针对不同平台做不同实现
    注意一:抽象类不能实例化。我们的Map虽然是个抽象类,但是可以创造Map实例(var map = Map()),是因为Map提供了一个工厂方法(返回一个子类实例);源码为: external factory Map(); 在dart的源码中可以看到实现为: factory Map() => LinkedHashMap<K,V>();
    注意二:抽象类中的抽象方法必须被子类实现, 抽象类中的已经被实现方法, 可以不被子类重写.

  • 隐式接口
    Dart中的接口比较特殊, 没有一个专门的关键字来声明接口.
    默认情况下,定义的每个类都相当于默认也声明了一个接口,可以由其他的类来实现(因为Dart不支持多继承)
    在开发中,我们通常将用于给别人实现的类声明为抽象类:

abstract class Run {
  run();
}
class Fly {  // 这里我们也可以把Fly类当做一个接口
    print('fly');
  }
}
class SuperMan implements Run, Fly { // implements用来实现接口,实现的接口不可以调super方法
  @override
  run() {
    print('超人在奔跑');
  }
  @override
  fly() {
    print("fuperman fly");
  }
}
  • 混入(Mixin)
    在通过implements实现某个类时,类中所有的方法都必须被重新实现(无论这个类原来是否已经实现过该方法)。
    但是某些情况下,一个类可能希望直接复用之前类的原有实现方案,怎么做呢?
    使用继承吗?但是Dart只支持单继承,那么意味着你只能复用一个类的实现。
    Dart提供了另外一种方案: Mixin混入的方式
    除了可以通过class定义类之外,也可以通过mixin关键字来定义一个类。
    只是通过mixin定义的类用于被其他类混入使用,通过with关键字来进行混入。
mixin Runner {
  run() {
    print('在奔跑');
  }
}
mixin Flyer {
  fly() {
    print('在飞翔');
  }
}
// implements的方式要求必须对其中的方法进行重新实现
// class SuperMan implements Runner, Flyer {}
class SuperMain with Runner, Flyer {

}

调用顺序,有自己的实现用自己的实现,没有自己的实现用混入的实现,没有混入的实现用继承的实现,如果都没有就报方法找不到的错误了

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

推荐阅读更多精彩内容