博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

02-02dart语法

Posted on 2020-11-23 23:18  肖无情  阅读(51)  评论(0编辑  收藏  举报

1、类

  • Getters 和 setters 方法

每个实例变量都有一个隐式的getter

class Rectangle {
  num left, top, width, height;
  Rectangle(num left,num top,num width,num height){
    this.left = left;
    this.top = top;
    this.width = width;
    this.height = height;
  }

  Rectangle(this.left, this.top, this.width, this.height);
  num get right => left + width;//=> 单行函数简单写法,返回值可有可无
  set right(num value) => left = value - width;

}
  • 实现类中的方法,必须有body

  • 抽象类中

    abstract class People{
         void eat(){
           print("People =====【 eat 】");
         }
         void walk();
    }
    

2、抽象类

除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

  • 如果一个类包含抽象方法,那么该类必须是抽象类。

  • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  • 抽象类中有成员变量、成员方法和构造方法 还可以有抽象方法

    abstract  class People {
    	String name;
    	People(String name) {
    	}
    	void eat() {
    		System.out.println("People =====【 eat 】");
    	}
    	abstract void walk();
    }
    

    Dart 中抽象方法可以省略 abstract

abstract class People {
  String name;
  People({String name}) {
  }
  void eat() {
    print("People =====【 eat 】");
  }
  void walk();
}
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类
class Student extends People{
  @override
  void walk() {
     eat();
  }
}

Java

class Student extends People {
	Student(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
	@Override
	void walk() {
		// TODO Auto-generated method stub
	}
}

dart 没有interface 关键字 但是有implements   每一个class (包括abstract class) 都隐含一个接口 都可以使用implement

abstract class Animal{
  void run();
}

 class People {
  String name;
  People({String name})
  void walk(){}
}
class Student implements People{
  @override
  String name;
  @override
  void walk() {
    // TODO: implement walk
  }
}
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

    1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
    1. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。、

        String name;
      
        People({String name}) {
        }
        void eat() {
          print("People =====【 eat 】");
        }
        void walk();
      }
      
      class Student extends People{
        @override
        void walk() {
           eat();
        }
        
      }
      
  • 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

其他部分见技术分享ppt

3、mixin

mixin是在多个类层次结构中重用代码的一种方式。

mixin Animal{

  void run(){}
}

 mixin People {
  void walk(){}
}

class Student with Animal,People {

  void eat() {
    run();
    walk();
  }
}

4、泛型

  • 泛型类
【abstract】 class Cache<T> {
  T getByKey(String key);
  void setByKey(String key, T value);
}
  • 泛型方法

    泛型参数()允许你在很多地方使用类型参数T

    • 在函数的返回中返回类型(T)

    • 在参数的类型中使用(List)

    • 在局部变量的类型中(T tmp)

    • 限制参数化类型

T first<T>(List<T> ts) {
  // Do some initial work or error checking, then...
  T tmp = ts[0];
  // Do some additional checking or processing...
  return tmp;
}
class Foo<T extends SomeBaseClass> {
  // Implementation goes here...
  String toString() => "Instance of 'Foo<$T>'";
}

class Extender extends SomeBaseClass {...}

可以使用SomeBaseClass 或它的任何子类作为泛型参数:

var someBaseClassFoo = Foo<SomeBaseClass>();
var extenderFoo = F
class GeneralTest<T>{
   T _vari;
   T get myVari{
     return _vari;
   }
   GeneralTest.newVV(){

   }

   GeneralTest(T t){
     this._vari = t;

   }

   void setV(T v){
     _vari = v;
   }

   static T newV<T>(T t){

     return  t;
   }

}

class Test{

  void main(){
    GeneralTest<BT>.newVV();//命名构造函数
//    GeneralTest.newV(BT(i: 2)).name; 静态方法
  }
}

对provider 的封装

import 'package:provide/provide.dart';
import 'package:xxwq_flutter/libs/states/config_state_model.dart';

class ProvierHelper{

  static var providers = Providers();
  static var themeConfigModel = ThemeConfigModel();

  static init({model,child,dispose = true}){

    providers = Providers()
      ..provide(Provider<ThemeConfigModel>.value(themeConfigModel));

    return ProviderNode(child: child, providers: providers,dispose: dispose);
  }

  static connect<T>({builder, child, scope}) {
    return Provide<T>(builder: builder, child: child, scope: scope);
  }
  static T value<T>(context,{scope}){
    return Provide.value<T>(context,scope: scope);
  }
}