磨刀- Dart 类 - 图1

声明:

  1. // 所有的类都集成于Object ,Object没有父类
  2. class Person1 {
  3. //定义属性
  4. String name;
  5. int age;
  6. String _sex; //通过下划线定义私有属性
  7. //构造函数
  8. Person1(this.name,this.age);
  9. //定义实例方法
  10. void fun1() {
  11. }
  12. //重写父类方法
  13. @override
  14. String toString() {
  15. // TODO: implement toString
  16. return 'name: $name, age: $age';
  17. }

创建实例

  1. var person = Person1('wei',18);
  2. person.fun1();

构造函数

默认构造函数

默认构造函数,如果类没有显示声明构造函数,那么就有默认构造函数,默认构造函数是与类同名且无参数无返回值的函数。

  1. class Person3{
  2. String name;
  3. int age;
  4. //未声明,默认
  5. }

自定义构造函数

  • 可选参数、默认参数

    1. class Person2 {
    2. String name;
    3. int age;
    4. String city;
    5. String country;
    6. //自定义构造方法{}中为可选参数, this.country = 'china' 参数设置默认值
    7. Person2(this.name,this.age,{this.city,this.country ='China'});

}

  1. void main() {
  2. var person = Person2('wei', 18);
  3. print('name: $person.name,age:$person.age');
  4. //调用可选参数需要 paramName: value的形式指定为哪个可选参数赋值:如city
  5. var person1 = Person2('dong', 18,city: '济南');
  6. print('city: $person.city');
  7. }
  1. <a name="FOBOJ"></a>
  2. ### 命名构造方法
  3. 可以为类声明多个构造函数的方式

class Person3{ String name; int age; //命名构造函数:类名+.+方法名 Person3.run(String name, int age){ this.name = name; this.age = age; }

  1. Person3.run2(String name){
  2. this.name = name;
  3. }

}

  1. <a name="qbyqM"></a>
  2. ### 工厂构造方法
  3. - 使用factory修饰
  4. - 也是单例模式
  5. - 构造函数内有返回值,类型是当前类或子类
  6. ```dart
  7. ///工厂构造方法演示
  8. class Logger {
  9. static Logger _cache;
  10. // 工厂构造方法:
  11. // 不仅仅是构造方法,还是单例模式
  12. factory Logger() {
  13. if (_cache == null) {
  14. _cache = Logger._internal();
  15. }
  16. return _cache;
  17. }
  18. Logger._internal();
  19. void log(String msg) {
  20. print(msg);
  21. }

}

  1. * **命名工厂构造方法**
  2. * factory 类名+.+方法,其实就是在命名构造方法前面加 factory
  3. * 一种灵活获取类对象的方式

class Person3{ String name; int age; //工厂命名构造函数 factory 类名+.+方法名 factory Person3.run3(String name){ print(name) } }

  1. * **静态构造方法**
  2. * 类的对象不会改变
  3. * 类的变了不会改变=》常量
  4. * 使用final修饰变量
  5. * 创建实例时,使用const

class Class1{ final int a; final String b; const Class04(this.a,this.b); void fun01(){ print(“aa”); } } void main(){ var class06 = const Class1(4, “ccc”); class06.fun01(); print(class06.a); }

  1. * **重定向构造函数**
  2. 在类的构造函数中,有时我们只是需要调用到另一个构造函数。

class Class05{ int a; String b; Class05(int a,String b){ this.a = a; this.b = b; } Class05.fun1(int a){ this.a = a; } Class05.fun2(String b):this.fun1(33);//重定向到fun1 Class05.fun3(String b):this(33,”ddddd”);//重定向到构造函数 }

  1. ## setters 和 getters
  2. * 修饰属性
  3. * 使用set赋值
  4. * 使用get获取值

class Person5 {

  1. String _school; //私有属性
  2. String name ;
  3. //可以为私有字段设置getter来让外界获取到私有字段
  4. String get school => _school;
  5. //可以为私有字段设置setter来控制外界对私有字段的修改
  6. set school(String value) {
  7. _school = value;
  8. }

}

var main() {
var person = Person5();
//用set方法赋值
person.school = ‘衡水中学’;
//用getang方法获取到school的值
print(person.school);
}

  1. ## 抽象类
  2. * 使用abstract 修饰
  3. * 不能被实例化,可以定义抽象方法
  4. * 在定义接口的时候非常有用

///继承抽象类要实现它的抽象方法,否则也需要将自己定义成抽象类
class StudyFlutter extends Study {
@override
void study() {
print(‘我爱学习,我爱Flutter’);
}
}

abstract class Study {
void study();
}

  1. ## 继承
  2. * 使用extends 关键字标示继承
  3. * 构造方法不能被继承
  4. * 使用@override 重写函数
  5. * 如果继承的抽象类,要实现所有抽象函数
  6. 继承普通类
  7. * 子类至少定义一个构造函数调用父类的任一构造函数,使用:super
  8. * 子类的每个构造函数都要继承父类的任一构造函数。
  9. * 子类可重写父类的函数。

class PersonO {

  1. String name;
  2. int age;
  3. PersonO(this.name,this.age);//普通构造函数
  4. PersonO.run(String name){ //命名构造函数
  5. this.name = 'my name: $name';
  6. }
  7. fun1() {
  8. print('fun1');
  9. }

}
class StudentO extends PersonO {

  1. String name;
  2. int nums;
  3. int color;
  4. //至少需要定义一个构造函数调用父类的任一构造函数
  5. StudentO(String name, int age) : super(name, age);
  6. //重写父类的方法
  7. @override
  8. fun1() {
  9. // TODO: implement fun1
  10. return super.fun1();
  11. }
  12. //子类自己的方法
  13. void fun2(){
  14. print(nums);
  15. }
  16. }
  1. 按住option会给出提示
  2. ![](https://upload-images.jianshu.io/upload_images/1503437-274831d766f6f569.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  3. ## minxins
  4. * minmins 是在多个类层次结构中重用代码的一种方式,类型swift中协议,当然swift中协议比这个用处大多了.也像python中的装饰器执行顺序也是一样
  5. * 使用minmins 要加with关键字.多个名字用逗号隔开.
  6. * 不用声明任何构造方法,不调用super

class Person001 {

String getName() => ‘wei1’ ;//三个类都有
String getAddress() => ‘历下区’; //该类独有
}

class Person002 {
String getName() => ‘wei2’;//三个类都有该方法
String getColor() => “2 red”;//该类独有
int getNum()=> 6;//该类和OtherClass都有
String getCity()=>”济南”;
}

class OtherPerson {
String getName() => ‘wei2’;//三个类都有该方法
int getNum() => 3; //该类和With2都有
int getDesk() => 333;//该类独有

String getPhone()=>”OtherPerson 123”;//该类和子类
String getCity()=>”青岛”;
}

class Child1 extends OtherPerson with Person001,Person002 {

@override
String getPhone() {
// TODO: implement getPhone
print(‘child 1 1’);
}

@override
String getCity() {
// TODO: implement getCity
print(‘city child 11 ‘);
}

}

class Child2 extends OtherPerson with Person001, Person002 { }

print(‘——————minxins—————-Start’);

  1. Child1 c1 = Child1();
  2. print(c1.getPhone());//Child1 iphone 重写了函数,调用时用的是自身的函数
  3. print(c1.getCity());//Child1 oriange 重写了函数,调用时用的是自身的函数
  4. print(c1.getDesk());//333 调用的是OtherPerson的函数 person1 person2中没有同名函数
  5. print(c1.getNum());//6 调用的是person2中的函数
  6. print(c1.getAddress());//person1 历下区 调用的是person1中的函数
  7. print(c1.getColor());//person2 2 red 调用的是person2中的函数
  8. print(c1.getName());//person2 wei2 调用的是person2中的函数 person2在声明顺序中更靠后
  9. print("-----------------------");
  10. Child2 c2 = Child2();
  11. print(c2.getPhone());//OtherPerson 123 没有重写函数,调用时用的是OtherPerson的函数
  12. print(c2.getCity());//济南 没有重写函数,调用时用的是person2的函数,虽然OtherPerson也有,但person2在声明顺序中更靠后
  13. print(c2.getDesk());//333 调用的是OtherPerson的函数 person1 person2中没有同名函数
  14. print(c2.getNum());//6 调用的是person2中的函数
  15. print(c2.getAddress());//历下区 调用的是Person1中的函数
  16. print(c2.getColor());//2 red 调用的是Person2中的函数
  17. print(c2.getName());//wei2 调用的是Person2中的函数 Person1在声明顺序中更靠后
  18. print('------------minxins-----------end');
  1. 理解:
  2. 1. A extends B with C,D{}
  3. 2. A 继承了B 并拥有了CD所有的属性和函数,可以用A的实例直接调用CD的属性方法。
  4. 3. 如果B有函数fun1A重写了这个函数 那么以后A的实例调用的fun1,都是A重写后的方法。
  5. 4. 如果B有函数fun1CD中也有函数fun1A重写了这个函数 那么以后A的实例调用的fun1,都是A重写后的方法。
  6. 5. 如果B有函数fun1CD中也有函数fun1A没有重写这个函数 那么以后A的实例调用的fun1,是声明方法时最后的那个类的函数,比如“A extends B with C,D”,那么就是D中的fun1,如果是“A extends B with D,C”,那么就是C中的fun1。也就是说优先级是从后向前的(前提是子类没有重写函数)。
  7. 6. Python中装饰器是一样的
  8. 参考: https://www.jianshu.com/p/232271ad2768