美文网首页FlutterDart
Dart 面向对象 上(二)

Dart 面向对象 上(二)

作者: 向日花开 | 来源:发表于2020-02-12 21:34 被阅读0次

    Dart 也是面向对象的语言,同样有着封装、继承、多态的特性。

    类的定义

    同 Java 一样使用 class 关键字申明一个类,final 修饰的属性,不能被外部重新赋值,只可读,不可写。

    //类的定义, class 作为关键字声明
    class Person {
      //共有变量
      String name;
    
      //私有变量
      int _age;
    
      //final修饰的属性,不能被外部重新赋值,只可读,不可写
      final String phone = '12345678901';
    
      //类方法
      String show() {
        String msg = "name:${this.name}\tage:${this._age}\tphone:${this.phone}";
        print(msg);
        return msg;
      }
    }
    

    类的权限

    Dart 类中默认的权限都是公开的,在变量或者方法名前面加下划线"_”的前缀即为私有变量或方法。

      //私有变量
      int _age;
      //私有方法
      void _info(){
        String msg = "name:${this.name}\tage:${this._age}\tphone:${this.phone}";
        print(msg);
      }
    
    

    类的实例化

    Java 中类的实例化需要用到 new 关键字,dart 实例化也一样,或者直接省略 new 关键字,获得对象 。

        Person person = new Person();
        Person person1 = Person();
    
        person.name = "person";
        person1.name = "person1";
    
        person.show();
        person1.show();
    

    Getter 和 Setter 方法

    对于类的私有变量,我们不可以直接访问,赋值。我们可以通过 get 和 set 方法来获取和赋值。

      //getter  setter 方法
    
      //get 获取age
      int get age => _age;
    
      //set 设置age
      set age(int value) {
        _age = value;
      }
    
    

    构造方法

    常见的有参无参构造方法
    //动物类定义
    class Animal {
      String name;
    
      int age;
    
      //1.默认的无参构造函数
      //Animal() {}
    
    
      //2.Dart语法糖有参构造方法,因为Dart 不能重载,所以默认的注释
      Animal(this.name,this.age);
    
      //类方法
      void show() {
        String msg = "name:${this.name}\tage:${this.age}";
        print(msg);
      }
    }
    
    
    void main(){
      Animal animal1 = new Animal();
      animal1.name = "猫咪";
      animal1.age = 1;
      animal1.show();
    
      Animal animal2 =new Animal("Dog", 2);
      animal2.show();
    }
    
    
    命名构造方法

    定义: 类名.方法名(),和一些自己需要赋值的参数。

    作用:可以灵活的根据需要定义多个自己需要的构造函数。

     //3.命名构造方法
      Animal.withNew(String name,int age){
        this.name=name;
        this.age=age;
      }
    
      Animal animal3 = Animal.withNew("猪", 1);
      animal3.show();
    
    常量构造方法

    当类的属性设置一次之后,就不会再设置了,那么这个类就可以声明为常量类,常量类的属性使用 final 修饰,而构造方法使用 const 修饰。

    //4.常量构造方法
    //如果需要将对象作为常量,就需要将构造方法声明为常量构造方法
    //使用常量构造方法的对象,属性和构造方法都为常量,属性使用final修饰,构造方法使用const修饰
    //常量型对象运行时更快,如果对象的值设置一次后就不会改变,可以使用这种方式
    class Animal1 {
      final String name;
    
      final int age;
    
      const Animal1(this.name, this.age);
    
      //类方法
      void show() {
        String msg = "name:${this.name}\tage:${this.age}";
        print(msg);
      }
    }
    
      const animal4 = Animal1("驴", 10);
      animal4.show();
    
    
    工厂构造方法
    ///5.工厂构造方法演示
    class Logger {
      static Logger _cache;
    
    //  工厂构造方法:
    //  不仅仅是构造方法,更是一种模式
    //  有时候为了返回一个之前已经创建的缓存对象,原始的构造方法已经不能满足要求
    //  那么可以使用工厂模式来定义构造方法
      factory Logger() {
        if (_cache == null) {
          _cache = Logger._internal();
        }
        return _cache;
      }
    
      Logger._internal();
    
      void log(String msg) {
        print(msg);
      }
    }
    
    参数列表构造方法

    初始化列表的格式,在构造方法名后加 :属性=值,不同的变量用逗号分隔。

    // 6.参数列表构造方法
    class Animal2 {
      String name;
    
      int age;
    
      final String id;
    
      //
      Animal2(String name, this.age)
          : name = name,
            id = "12";
    }
    
    

    静态成员

    • 静态方法,只能访问静态成员。
    • 实例方法,既能访问静态成员,也可以访问实例成员

    对象操作符

    安全对象操作符(?)

    判断一个对象为空不用在写 if 判断,直接如下:

    Person person;
    //?.对象操作符,在对象为null时,不会进行调用
    person?.show();
    
    
    as 操作符

    将对象强制转为某一类型,如果类型强转出错则会抛出异常。

    //没有推断出Person,类型为dynamic
    var person2;
    //因为类型为dynamic,可以赋值任意类型
    person2 = "";
    //as操作符,强转类型,这里是String类型,强转为Person类型会抛出异常。
    (person2 as Person).show();
    
    
    is 操作符

    判断对象是否为某个类型的实例。是返回 true,不是则返回 false,dart 通过 is 判断后不需用 as 转型即可使用。

    if (person2 is Person) {
        print('object is Person');
    }
    
    if (person2 is Person) {
        //经过了is操作符判断,就不用as操作符再转换再操作
        person2.show();
    }
    
    ..级联操作符

    对象后面.. ,即可实现对象的链式调用。

    //级联操作符,每次操作后都返回自身,方便链式调用
    var person3 = new Person();
    person3
    ..name = 'hello'
    ..age = 20
    ..show();
    

    最后

    贴一张自己学习Flutter的公众号,感兴趣的小伙伴可以一起学习哦。。。

    相关文章

      网友评论

        本文标题:Dart 面向对象 上(二)

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