Flutter之Dart语法面向对象

Posted 王飞飞不会飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter之Dart语法面向对象相关的知识,希望对你有一定的参考价值。

在Dart语法中,用关键字class表示类。

class Person 
  
  • 私有和公有

Dart中公有和私有的界定是以文件界定的,并不是通过类界定的,如果不允许其他文件访问当前文件中的成员变量,或者不允许调用方法,可以定义成员变量或者方法的时候以下划线开始。

class Person 
  //内部变量
  String _id = "111";
  //外部变量
  String? name;
  //内部方法
  void _printId() => print("id is $_id");
  //外部方法
  void printName() => print("name is $name");

注意,如果是在其他文件中定义一个Person子类,是不能继承内部方法的。如果是在本文件中是可以继承的。

//本文件中是没问题的,编译器是有提示的。
class Teacher extends Person 
  Teacher(String id, int age) : super(id, age);

  @override
  void _printId() 
    // TODO: implement _printId
    super._printId();
  

//其他文件中只能继承外部方法
class Student extends Person 
  Student.initWith(String name, int age) : super.initWith(name, age);

  @override
  void printName() 
    // TODO: implement printName
    
  

  • 构造方法
class Person 
  String? name;
  String _id = "111";
  late int age;

  //默认构造函数
  // Person(this._id, this.age);

  //命名构造函数
  Person.initWith(String name, int age) 
    this.name = name;
    this.age = age;
  

  //带有初始化列表的构造函数
  Person(String id,int age):assert(age > 0) 
    this.age = age;
    this._id = id;
  

  • 类属性和类方法

Dart中类变量和类方法都用static关键字修饰,在调用的时候方法如下。

void _test() 
  Person.isa = "1111111111";
  Person.getMethList()


class Person 
  String? name;
  String _id = "111";
  late int age;

  static String isa = "0";

  static void getMethList() 
    print("it is not object-c");
  
  • 单例

Dart中,构造函数是没有return的,如果想要ruturn,需要在构造函数前面加上关键字factory,原始写法

class Application 
  static  Application? _shared;

  // 私有的命名构造函数,外界不能调用
  Application._init();

  // 使用factory关键字
  factory Application() 
    if (_shared == null) 
      _shared = Application._init();
    
    return _shared!;
  

可以稍作优化,三行代码搞定单例。

class Application 
  static  Application? _shared;

  // 私有的命名构造函数,外界不能调用
  Application._init();

  factory Application() => _shared ??= Application._init();
  • 继承

Dart中是单继承,继承一个类后,可以通过@override来重写父类中的方法,也可以通过super来调用父类中的方法。构造函数是不能呗继承的。

class Animal extends Object 
  late double  height;
  late double  weight;

  void eat() => print("eat food"); 
  void sleep() => print("sleep");


class Dog extends Animal 
  @override
  void eat() => print("eat shit");


class Cat extends Animal 

  • 接口(implements)

Dart中没有interface关键字,但每个类都是隐式的接口。当类被abstract修饰的时候(抽象类),是无法被实例化为对象的,只能当接口。

void _test() 
    //这里会报错
    CanAccompanyMaster acc = new CanAccompanyMaster();
  

//接口定义
abstract class CanAccompanyMaster 
  void dance() 
    print("dance");
  

  void makeFun();
  


class MakeFood 
  void cook() 
    print("as delicious food");
  


//Dart中每个类都是一个隐式的接口
//接口中的方法需要被重新实现
class Pig extends Animal implements CanAccompanyMaster, MakeFood 
  @override
  void cook() 
    // TODO: implement cook
  

  @override
  void dance() 
    // TODO: implement dance
  

  @override
  void makeFun() 
    // TODO: implement makeFun
  

  • 混入(mixins)

在面向对象的语音中,mixins是一个可以把自己的方法提供给其他类使用,并且可以不需要成为其他类子类的类。以非继承的方式来复用类中的代码。要使用mixins,用关键字with来复用类中的代码。


class Cat extends Animal 
  void catchMouse() => print("catch mouse");


// The class 'Cat' can't be used as a mixin because it extends a class other than Object
// class Dog extends Animal with Cat 
//   @override
//   void eat() => print("eat shit");
// 

class LitterCat 
  void catchMouse() => print("catch mouse");


class Dog extends Animal with LitterCat 
  @override
  void catchMouse() 
    // TODO: implement catchMouse
    super.catchMouse();
  

注意,如果是作为混合的类,不能有extends。如有有extends编译器会报错。

以上是关于Flutter之Dart语法面向对象的主要内容,如果未能解决你的问题,请参考以下文章

Flutter之Dart语法面向对象

Dart语法篇之面向对象基础

Dart语法篇之面向对象继承和Mixins

Flutter学习资料整合

Flutter入门-Dart面向对象原理

无标题