Dart 面向对象OOP(封装,继承,多态)

面向对象OOP

// 构造方法:标准构造方法,初始化列表,工厂构造方法
// 实例方法、静态方法、getters和setters方法
// 抽象:抽象类,抽象方法,mixins


OOP.jpg

标准构造方法,初始化列表。

// 所有的类都继承自Object
class Person {
  String name;
  int age;
  /// 标准构造方法
  Person(this.name, this.age);
  // 多态的运用,重写父类的方法。
  @override
  String toString() {
    return 'Person{name: $name, age: $age}';
  }
}

class Student extends Person {
  String _school; // 定义私有变量(类的变量)
  String? city; // **可选参数**。
  String country; // **默认参数**
  String name; // 初始化列表。
  // 初始化父类,同时初始化本身的的参数。
  // this._school 初始化私有参数;name,age交给父类初始化。
  // city 可选参数; country 默认参数。
  Student(this._school, String name, int age, {this.city, this.country = 'China'})
      : // 初始化列表:除了调用父类构造器,在子类构造器方法体之前,可初始化实例变量,
        // 不同的初始化变量之间用逗号分隔开。
        name = '$country.$city',
        // 父类构造方法,
        super(name, age);
        // super(name, age) { print('构造方法体,不是必须的。');}
        
  // 命名构造方法:[类名.方法名]
  // 命名构造方法,为类实现多个构造方法。
  Student.cover(Student stu) : super(stu.name, stu.age);
  Student.cover2(Student stu) : super(stu.name, stu.age) {
   print('命名构造方法体');
  }
} 

命名构造方法

// 所有的类都继承自Object
class Person {
  String name;
  int age;
  /// 标准构造方法
  Person(this.name, this.age);
  // 多态的运用,重写父类的方法。
  @override
  String toString() {
    return 'Person{name: $name, age: $age}';
  }
}
class Student extends Person {
  // 命名构造方法:[类名.方法名]
  // 命名构造方法,为类实现多个构造方法。
  Student.cover(Student stu) : super(stu.name, stu.age);
  // 命名构造方法也可以有方法体
  Student.init(Student stu) : super(stu.name, stu.age) {
   print('命名构造方法体');
   print("命名构造方法 : name : ${stu.name}, age : ${stu.age}");
  }
}

工厂构造方法

/// 单例:工厂构造方法:不仅仅是构造方法,也是一种模式。
/// 有时候为了返回之前已经创建好的缓存对象,原始的构造方法已不能满足需求,可以使用工厂模式来定义构造方法。

class Logger {
  static Logger? _cache;
  // 工厂构造方法,返回唯一的实例。
  factory Logger() {
    if (_cache == null) {
      _cache = Logger._internal();
    }
    return _cache!;
  }

  Logger._internal(); // 私有构造方法
  void log(String msg) {
    print(msg);
  }
}

命名工厂解析方法,常用于json转模型

// factory [类名.方法名], 可以有返回值。

factory Student.stu(Student stu) {
  return Student(stu._school, stu.name, stu.age);
}

get,set,静态方法。

 String _school;
 /// 私有字段,设置get,set来让外接获取或修改私有字段。
String get school=> _school;
set school(String value) {
    _school=value;
}
// 静态方法。
static doPrint(String str) {
    print('doPrint: $str');
}

Student.doPrint('类的静态方法调用');
// 使用get,set
Student stu1 = Student('清华', 'tom',19);
stu1.school = '985';

抽象类和方法。

// 继承抽象类要实现它的抽象方法,否则需要将自己定义为抽象类。

class StudyFlutter extends Study {
  @override
  void study() {
    print('learning flutter.');
  }
}
/// abstract 定义抽象类,该类不能被实例化。抽象类在定义接口时非常有用,
abstract class Study {
  void study(); // 定义抽象方法
}

mixin

mixins 是多个类层次结构中重用代码的一种方式。
要使用mixins,在with关键字后面跟上一个或多个mixins的名字(逗号分割),且with要在extends后面。
// mixins特征:实现mixins,创建一个继承自Object类的子类(非其他类),不声明任何构造方法,不调用super。

abstract class Study{
  void study();
}
// 使用mixins,为类添加特征。
class Test extends Person with Study{
  Test(String name, int age) : super(name, age);
  @override
  void study() {
  }
}
class FunctionLearn {
  /// 方法的构成:返回值+方法名+参数
  /// 返回值可省略,也可为void或具体类型
  /// 方法名:匿名方法不需要方法名
  /// 参数:参数类型和参数名,参数类型可省略。
  int sum(int v1, int v2) {
    return v1 + v2;
  }

  /// 使用下划线命名开头的方法,是私有方法,作用域为当前文件内。
  /// 匿名方法
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容