03_dart 类和对象

  • dart 是一个面向对象的语言;面向对象有 (1)继承 (2)封装 (3)多态
  • dart的所有东西都是对象,所有的对象都是继承自object类
  • 一个类通常是由属性和方法组成的;

命名规范

  • 使用lowercase_with_underscores风格来命名库和文件名名称
  • 类名使用大驼峰(和java一样)
  • 变量名和方法名使用小驼峰(和java一样)
//每一个实例变量都会自动生成一个geter方法(隐式的)。非final修饰实例变量自动生成一个seter方法.
class Point{
  int x = 0;
  
  int y = 0;
}

构造函数

由于把构造函数参数赋值给实例变量的场景太常见了,Dart提供了—个语法糖来简化这个操作

//每一个实例变量都会自动生成一个geter方法(隐式的)。非final修饰实例变量自动生成一个seter方法.
class Point{
  int x=0;
  int y=0;
  //构造方法
  Point(this.x,this.y);
}

命名构造函数

drat中没有重载构造函数,只有命名构造方法

class Point {
  //此时为public修饰
  int x = 0;
  //使用_开头命名,相当于java的private修饰
  int _y = 0;

  Point(this.x, this._y);

  //命名构造方法,名字随便取
  Point.X(this.x);
  //私有命名构造方法,类似java用private修饰,在其他文件里面不能创建
  Point._Y(this._y);
  Point.Cool(int y){
    this._y=y;
    print('我好酷啊');
  }
  int getpY(){
    return _y;
  }
}

调用

import 'package:flutter_app/point.dart';

void main(){
  var point=new Point(2,3);
  print(point.x);
  var point2=new Point.X(5);
  print(point2.x);
  var point3=new Point.Cool(9);
  print(point3.getpY());
}

输出

2
5
我好酷啊
9
私有构造方法

命名构造方法前面用_修饰则为私有构造方法
调用

//私有命名构造方法,类似java用private修饰,在其他文件里面不能创建
  Point._Y(this._y);

参数初始化列表

初始化类属性

//参数初始化列表,可以不写方法体
  Point.XY()
      : x = 1,
        _y = 1 {
    print('参数初始化列表');
  }

调用

var point4=new Point.XY();
  print('${point4.getpY()}');

输出

参数初始化列表
1

重定向构造方法

命名构造函数,调用普通构造函数

class View{
  View(int context,int attr);
  //重定向构造方法
View.a(int context):this(context,0);

/*java写法
  View(int context){
    this(context,0);
  }*/
}

常量构造方法

属性用final修饰,构造方法用const修饰。就是常量构造方法

class ImmutabelPoint{
  final int x;
  final int y;
  //常量构造方法
  const ImmutabelPoint(this.x, this.y);
}
void main(){
  //使用new来创建常量构造方法和普通的对象没区别
  var imm1=new ImmutabelPoint(1, 1);
  var imm2=new ImmutabelPoint(1, 1);
  print(imm1==imm2);
  //使用const来对象对象,如果传递的参数一样,就表示是同一个编译常量对象(必须定义常量构造函数)
  var imm3=const ImmutabelPoint(1, 1);
  var imm4=const ImmutabelPoint(1, 1);
  print(imm3==imm4);
}

输出

false
true

工厂构造方法

用factory修饰的构造方法

class Manager{
  //必须要有普通构造方法
  Manager();
  //工厂构造方法
  factory Manager.get(){
    return new Manager();
  }
  //工厂方法和此方法在使用方面没什么区别
  // static Manager get(){
  //   return new Manager();
  // }
}

修饰符

使用_开头命名类和变量,相当于java中用private修饰

class Point{
  //此时为public修饰
  int x;
  //使用_开头命名,相当于java的private修饰
  int _y;
  Point(this.x,this.y);
  
}

get和set

每一个实例变量都会自动生成一个geter方法(隐式的)。非final修饰实例变量自动生成一个seter方法.

class Point2{
  //每一个实例变量都会自动生成一个geter方法(隐式的)。非final修饰实例变量自动生成一个seter方法.
  int x=20;
  int _y=30;

  
//会报错,表示x已经有了一个隐式的getx方法,不能在写一个相同的方法
  // int get _x(){
  //   return x;
  // }
  //会报错,表示x已经有了一个隐式的setx方法,不能在写一个相同的方法
  // void set x(int x){
  //   this.x=x;
  // }
  
  //私有的属性则可以添加get和set方法。y为方法名可以随便定义
  int get y => _y;
  void set y(int value) {
    _y = value;
  }
}
void main(){
  var point2=new Point2();
  //调用get
  print(point2.x);
  //set
  point2.x=23;
  print(point2.x);
  point2._y=14;
}

操作符重载

只重载运算里面的逻辑,对于运算符的优先级不会变,先乘除后加减不变

class Point2 {
  //每一个实例变量都会自动生成一个geter方法(隐式的)。非final修饰实例变量自动生成一个seter方法.
  int x = 20;
  int _y = 30;

  //操作符重载:重载加号:point2是方法返回值的类型
  Point2 operator +(Point2 other) {
    var point =new Point2();
    point.x=this.x+other.x;
    return point;
  }
}
void main() {
  var point1 = new Point2();
  var point2 = new Point2();
  point1.x = 1;
  point2.x = 2;
  //调用重载的+号
  var point3 = point1 + point2;
  //输出3
  print('${point3.x}');
}

抽象类

使用abstract修饰符定义一个抽象类。抽象类中允许出现没有方法体的方法

abstract class Parent{
  String name;
  void pintName();//抽象方法,不需要在方法前声明abstract
}

抽象类不能被实例化,除非定义工厂方法并返回子类

接口

与java不同,Dart中没有interface关键字。dart中每一个类都隐式定义了一个包含所有实例成员的接口。并且这个类实现了这个接口。如果你想创建类A来支持类B的方法,而不是继承B的实现。则类A应该实现leiB的接口。

class Listener{
  void onComplete(){}
  void onFailure(){}
}
//把类Listener看成是一个接口,直接实现,然后需要实现里面所有的方法
class MyListener implements Listener{
//实现Listener的方法
  @override
  void onComplete() {
    // TODO: implement onComplete
  }
//实现Listener的方法
  @override
  void onFailure() {
    // TODO: implement onFailure
  }
}

可调用的类

  • 如果一个类他包含一个call方法,则此类为可调用的类。可以快速调用call方法。
  • 要求方法名必须是call,参数和返回值不做要求
void main(){
  var t=new Test();
  t(2);//快速调用call方法
}
//可以调用的类
class Test{

  void call(int x){
    print('call$x');
  }
}

混合mixins

mixins是一种在多类继承中重用一个类代码的方法。它的基本形式如下:

//被mixin(混入)的类不能有构造函数
class A{
  void a(){}
}
class B{
  void b(){}
}
class C with A,B{
  void c(){}
}

with后面跟着需要混入的类,被mixin(混入)的类不能有构造函数。现在的c拥有了3个方法。(a,b和c).假设A和B有相同的方法。以最右侧的混入的类为主。比如:

//被mixin(混入)的类不能有构造函数
class A {
  void a() {}

  String getMessage() => "A";
}

class B {
  void b() {}

  String getMessage() => "B";
}
//满足了多继承的需求
class C with A, B {
  void c() {}

  C() {}
}
//当c类不需要有自己的方法的时候则可以写成如下方式
//class C=Object with A,B;
void main() {
  var c = new C();
  //第一优先级为自身,如果自身没有则以右侧为主:输出b
  print('${c.getMessage()}');
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值