dart基础之类接口操作符重载相关

Dart是一门面向对象语言,和java一样,所有的类都继承自Object。但是也有很多不一样的地方,比如对构造函数的支持、操作符重载等新玩法,本次介绍一下dart中的新玩法。


1.类中省略很多关键字

在创建对象时可以省略new关键字,直接Class()就可以创建了。然后类中方法返回值也可以省略,省略后就是dynamic类型,在实际运行时确定实际类型。


2.表示私有类方法和属性

在java中有private关键字代表私有,但是dart中并没有private关键字,而是规定以下划线_开头的类、方法、属性作为私有,对其他文件不可见。在dart中没有protected概念,只要不以下划线开头就是代表公有。


3.构造函数语法糖

在实际的开发中,经常在构造函数中给类中的变量赋值,而且写的代码都是千篇一律毫无营养。在dart中可以对该情况进行简写,不需要大括号都可以搞定。如下,我们在A类中定义好了给x、y属性赋值的最简方式,注意,参数一定要this.开头,不然运行是会报错的,因为没实现体,只有this.开头的参数才可以不写实现,系统自动给实现成给属性赋值。然后还有一个注意点,这里面的参数一定要写全,比如写成A(this.x)也会报错的。


4.命名构造函数

构造函数重载在java中是常用的,比如自定义view中需要同时写3个构造函数。 Dart 并不支持构造函数的重载,而采用了命名构造函数为一个类实现多个构造函数。在dart中构造方法名可以修改为和实际业务相关,比如a功能调用A.a( )构造方法,b功能调用A.b( )构造方法。


5.重定向构造方法

可以在构造方法上使用:this来重定向,调用该构造方法以后,相当于是调用另外的构造方法。需要注意的是,在java中是在方法体中使用this()的方式,dart中是不支持的。


6.常量构造方法

如果你的类提供一个状态不变的对象,你可以把这些对象 定义为编译时常量。要实现这个功能,需要定义一个 const 构造函数, 并且声明所有类的变量为final


7.工厂构造方法

当实现一个使用'factory' 关键词修饰的构造函数时,这个构造函数不必创建类的新实例。例如,一个工厂构造函数 可能从缓存中获取一个实例并返回,或者 返回一个子类型的实例。(工厂构造函数无法访问 'this')


利用这一特性,可以用工厂构造方法实现单例,dart中的单例和java中的类似,私有化构造方法,记录对外getInstance方法,在getInstance中创建对象并且返回。提示一下当然和java的实现方式一样,不使用这个构造方法,而是用一个static getInstance方法也是可以实现的。


8.getter和setter

这个有点意思,将某个新属性和类中其他属性建立关系,每当该属性变化时,可以直接给其他属性赋值。相当于是Java中首先定义了一个right变量,然后再变量的set中写好left=value-width,在get中写好right=left+width,但是dart中直接简写了。


9.操作符重载

dart是支持操作符重载的,可以将系统支持的操作符进行重载,赋予其另外的功能,目前dart中可以重载的操作符如下:

举个例子,可以用操作符重载让某个类的对象之间可以使用加减法操作。当然只要你高兴,也可以让类的对象和整数加减乘除什么的都是可以的。


10.抽象类

和java类似,dart中抽象类也是可以定义无实现的抽象方法。同时,抽象类也不可以实例化,除非定义工厂方法并返回子类,这里定义工厂方法是为了不让构造方法返回自身,因为自身是不可初始化的,具体的代码如下:


11.接口

在java中接口是用interface关键字声明,但是dart中不需要任何声明,任一个类都可以作为接口。当需要把某个类当做接口来实现时,只需要使用implements。dart中同一个类也可以实现多个接口,和java中一样必须复写父接口中的所有方法。如果父类中的方法被子类所实现,那么父类中的方法是不会执行的。接口和继承另一个区别是在继承中可以有选择性的复写父类中的方法,但是实现接口必须复写所有方法。


12.可调用的类

在dart中如果某类中有call方法,可以直接把类当做方法类调用,调用时执行类中的call方法。如下例,c为Closure对象,但是可以直接通过对象名的方法来调用call方法。这里由于初始化类时也需要传2个字符串,并且可以省略new关键字,就出现了以下的2组参数的情况,哈哈是不是很好玩呢?


13.混合机制mixins

mixins机制类似于多继承,可以使用'with'关键字将多个类中的方法混合到一起,供混合类来调用,这又是一个新玩法。需要注意的是,被混合的父类中不允许有构造方法。以下为一个最简单的mixins实例,C类是由A、B混合而成,所以C的对象可以调用A中的a方法。

特性一  如果被混合的多个类中含有相同的方法,则调用最后被混淆的那个

如下图,C类是由A类和B类混淆而成,然后A类和B类中都有a( ),最后用C类对象来调用a(),最后的结果是输出B,因为在混合时B比A更后面混合,所以调用B的。


特性二  如果被混合的类中含有的方法在混合类中本身存在,则调用混合类本身的方法。

在下图中,由于混合类C中本身就定义了a( ),所以最后调用的是C中的a( )。


特性三  混合类和继承是兼容的,二者结合还有特殊的写法

在下图中,AB类继承自P,然后混合了A类和B类,其中P类、A类、B类中都有相同的getMessage方法,最后在混合后的AB类中调用getMessage方法,最终执行到的是B类中的getMessage方法,原因是B类是最后混合的,其他2个类的都被B类中的覆盖了。需要注意的是,extends必须写在with前面,这也说明了被继承中的类中的方法只能被覆盖,不能覆盖被混合的类中的同名方法了。


混合类的使用场景:因为继承只能有一个父类,不能支持同时调用多个父类中的方法。而接口的话就必须实现所有的方法,但有时候我们想直接使用很多父类中的方法,而不想复写时就可以用到混合类,使代码变得相当实用简洁。如下图,person1想使用swimming方法和jump方法,所以必须继承swimming并且实现jump,最坑的是需要实现jump方法,而我们并不想修改jump的实现,虽然改完以后可以达到目的,但是未免显得繁琐,里面写了很多无用代码。再看看person2类直接with Swimming,Jump就搞定了,是不是简洁很多?


总结:本文分享了一下dart中有关类(对象)、抽象类、接口、混合、操作符重载等机制中和java不一样的地方,感觉dart中还是有很多人性化的地方,代码更加的简洁,而且比较容易上手。也难怪,dart的野心是替代js的地位,有这种种考虑也是底气的一部分。当然,dart中好玩的地方远远不止如此,后面会继续给大家分享,希望对大家有所帮助。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值