前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dart(四)--类、构造函数、方法dart(四)--类、构造函数、方法

dart(四)--类、构造函数、方法dart(四)--类、构造函数、方法

作者头像
用户8893176
发布2021-08-09 14:01:06
1.4K0
发布2021-08-09 14:01:06
举报
文章被收录于专栏:小黑娃Henry

构造函数

构造函数 className 或 className.identifier, 关键字 new 可选.
构造函数语句执行顺序:初始化器,父类构造函数,子类构造函数。
代码语言:javascript
复制
class Point {
    num x, y, distance;
    
    /*
        1,匿名构造函数
        2,使用this.x 简化写法,原写法: Point(num x , num y)
        3,此处 : 后为初始化器,初始化的结果赋值给初始化器的对象,是最简洁的方式。
        4,此处的this可以理解为self。
    */
    Point(this.x , this.y) : distance = sqrt(x * x + y * y);
    
    /*
        1,在初始化器里可以使用断言做一些判断
    */
    Point.withAssert(this.x , this.y) : assert(x>=0), 
        distance = sqrt(x * x + y * y);
    
    /*
        1,命名构造函数,获得原点坐标。
        2,此处 : 后为委托构造函数。
        3,委托构造函数需要满足参数x>=0,否则构造失败。
    */
    Point.origin() : this.withAssert(0, 0);
    Point.fromJson(map<String, num> json) : this(json['x'], json['y']);
    
    /*
        1,使用@override 来重写父类方法
        2,dart所有的对象都默认继承object
    */
    @override
    String toString() => 'Point(x: $x,y: $y)';

    /*
        1,num是方法的返回值 ,x是方法名 
        2,set,(num value)方法参数,无反回值。
    */
    num get x => sqrt(distance * distance + y * y);
    set x(num value) => y = sqrt(distance * distance + value * value);
}

常值实例创建方法

代码语言:javascript
复制
class ImmtablePoint {
    /*
        如果调用参数一致,创建出的实例也是同一个(内存地址相同)。
       1,类似于swift中单例的初始化方法。
       2,static final修饰的shared是静态的地址不可修改的实例变量.
       3,const ImmtablePoint(0,0) 表示初始化一个为常值的实例。
       4,shared变量是一个地址不可修改且内容为常值的ImmtablePoint类的实例。
       5,由于需要构造一个内容不可修改的实例,所以构造函数也需要被const修饰。
       6,常量构造函数内容不可修改则实例变量也不可修改,则实例变量也需要final来修饰。
    */
    static final shared = const ImmtablePoint(0,0);
    
    final num a,b;
    
    const ImmtablePoint(this.a, this.b);
}

抽象类

代码语言:javascript
复制
abstract class Doer {
    /*
        抽象类,方法无需实现
    */
    void doSomething();
}

class EffDoer extends Doer {
    /*
        1,指定抽象类拓展。
        2,拓展后需实现抽象类中的方法。
    */
    void doSomething() {
        print('doSomething');
    }
}

方法

代码语言:javascript
复制
/*
    1,在方法中的x,y,就是实例变量。如果在方法中出现重名,则需要用:this.x,this.y来表示。
*/
 num distanceTo(Point other){
    var dx = x - other.x;
    var dy = y - other.y;
    return sqrt(dx* dx + dy * dy);
}

/*
    factory,工厂方法
*/
factory Logger(String name) {}

/*
    构造函数前加 _ ,这个方法、构造函数,是一个私有方法,只能在类中自己使用。
*/
Logger._internal(this.x);

操作符覆盖

代码语言:javascript
复制
class Vector {
    final int x,y;
    Vector(this.x,this.y);
    
    /*
        1,+,-操作覆盖
        2,operator关键词
    */
    Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
    Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
    
    /*
        1,覆盖==符号,必须也好覆盖hashCode方法
    */
    @override
    int get hashCode {
        int res = 1;
        res = res + x.hashCode;
        res = res + y.hashCode;
        return res
    }
    
    @override
    bool operator ==(dynamic other){
        if (other is! Vector) return false;
        Vector newObj = other;
        return (newObj.x = x && newObj.y == y);
    }
}

方法类型定义

使用typedef来定义一个方法类型,包含:参数、返回值
代码语言:javascript
复制
typedef Compare = int Function(Object a, Object b);

// 同时支持泛型
typedef Compar<T> = int Function(T a, T b);

class soos{
    Compare compare;
    //自定义后依旧是Function的子类
    assert(compare is Function);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/4/22 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
    • 构造函数
      • 构造函数 className 或 className.identifier, 关键字 new 可选.
      • 构造函数语句执行顺序:初始化器,父类构造函数,子类构造函数。
    • 常值实例创建方法
      • 抽象类
      • 方法
        • 操作符覆盖
          • 方法类型定义
            • 使用typedef来定义一个方法类型,包含:参数、返回值
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档