Dart-类

作者: 哎呀啊噢 | 来源:发表于2019-07-27 17:02 被阅读0次
    Dart是一种面向对象的编程语言.支持面向对象的特性,比如类、接口、抽象等;
    
    • 使用class关键字声明一个dart类,后面跟类名,并且由一对花括号包围的类体
    • 所有类都有同一个基类,Object,dart的继承机制使用了Mixin;

    代码示例:

    class class_name {  
       <fields>
       <getters/setters>
       <constructors>
       <functions>
    }
    

    类包含:

    • <fields>字段,类中声明任何变量、常量;
    • <getters/setters> 如果对象为final,或const,只有一个getter方法
    • <constructors> 构造函数,为类的对象分配内存
    • <functions>函数,也叫方法,对象的操作;
    构造方法
    • 默认构造方法
    • 命名构造方法Class.name(var param)
    • 调用父类构造方法
    • 不可变对象,定义编译时常量对象,构造函数前加const
    • 工厂构造函数:factory
    代码示例
    
    //声明三个实例变量,所有的实例变量都会自动生成一个getter方法,没有声明为final的实例变量还会生成一个setter方法
    class Point {
      num x; //声明实例变量x,初始值为null
      num y; //声明实例变量y,初始值为null
      num z = 0; //声明实例变量z,初始化为0
    
    
      Point(){}//默认生成一个无参的构造方法
    
    
      Point.fromXYZ(num x, num y, num z) {//命名构造方法,可以创建多个构造方法
        this.x = x;
        this.y = y;
        this.z = z;
        print("Point");
      }
      //简写
    //    Point.fromXYZ(this.x,this.y,this.z);
    }
    
    
    
    //调用
    void main(){
      Point point = new Point();//new 构造
      point.x = 1;
      point.y = 2;
      point.z = 3;
    
      Point point1 = Point.fromXYZ(1, 2, 3);//命名构造
    
    }
    
    //调用父类构造方法
    class ColorPoint extends Point{
    
      String color;
    
      ColorPoint.fromXYZAndColor(num x, num y, num z, String color)
      :super.fromXYZ(x,y,z){
        this.color = color;
        print('ColorPoint');
      }
    
    }
    
    //调用
    void main(){
    
      var p = ColorPoint.fromXYZAndColor(1, 2, 3, "color");
      print(p);
    
    }
    
    //常量构造方法
    /*
    * 定义一个const构造方法 ,所以变量声明为final
    * */
    
    class ImmutablePoint {
      final num x;
      final num y;
      const ImmutablePoint(this.x, this.y);
      static final ImmutablePoint origin =
      const ImmutablePoint(0, 0);
    }
    
    //工厂构造方法   如果一个构造方法并不总是返回一个新的对象,这个时候可以使用factory来定义这个构造方法。
    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);
        }
      }
    }
    
    //调用
    void main(){
      //工厂
      var logger = new Logger('UI');
      logger.log('Button clicked');}
    

    要注意的是工厂构造方法时没法访问this关键字的,所以上面就有了在类的内部这么调用构造方法的代码:final logger = new Logger._internal(name);
    在上面工厂构造方法中,如果缓存中存在传入的name的key值,则取出缓存中的对应value返回。
    如果缓存中没找到,就会通过命名构造方法来新建一个对象,缓存起来后返回

    相关文章

      网友评论

          本文标题:Dart-类

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