Flutter 关键字详解及用法示例
一、extends(继承)
详细说明
· 用于创建类的继承关系
· 子类继承父类的所有公有和保护成员
· 支持单继承(一个类只能继承一个父类)
使用场景
· 当需要扩展现有类的功能时
· 当多个类有共同的属性和方法时
· 实现代码复用
示例代码
// 父类classAnimal{Stringname;int age;Animal(this.name,this.age);voideat(){print('$nameis eating');}voidsleep(){print('$nameis sleeping');}}// 子类继承classCatextendsAnimal{Stringbreed;// 调用父类构造函数Cat(Stringname,int age,this.breed):super(name,age);// 重写父类方法@overridevoideat(){print('$name(a$breedcat) is eating fish');}// 新增方法voidmeow(){print('$namesays: Meow!');}// 调用父类方法voidsleepAndEat(){super.sleep();this.eat();}}// 使用voidmain(){varcat=Cat('Kitty',2,'Persian');cat.eat();// 输出: Kitty (a Persian cat) is eating fishcat.meow();// 输出: Kitty says: Meow!cat.sleep();// 调用父类方法}继承的层次结构
// 多层继承classLivingThing{voidbreathe()=>print('Breathing...');}classAnimalextendsLivingThing{voidmove()=>print('Moving...');}classMammalextendsAnimal{voidfeedMilk()=>print('Feeding milk...');}classDogextendsMammal{voidbark()=>print('Barking...');}voidmain(){vardog=Dog();dog.breathe();// 来自 LivingThingdog.move();// 来自 Animaldog.feedMilk();// 来自 Mammaldog.bark();// 自己的方法}二、implements(接口实现)
详细说明
· 用于实现一个或多个接口
· 必须实现接口中定义的所有公共成员(属性和方法)
· 一个类可以实现多个接口
使用场景
· 定义契约/协议
· 强制类实现特定功能
· 多态性实现
示例代码
// 定义接口abstractclassVehicle{voidstart();voidstop();intgetmaxSpeed;}abstractclassElectric{voidcharge();intgetbatteryLevel;}// 实现多个接口classElectricCarimplementsVehicle,Electric{Stringmodel;int _currentSpeed=0;int _battery=100;ElectricCar(this.model);@overridevoidstart(){print('$modelstarting silently...');_currentSpeed=10;}@overridevoidstop(){print('$modelstopping...');_currentSpeed=0;}@overrideintgetmaxSpeed=>200;@overridevoidcharge(){print('Charging$model');_battery=100;}@overrideintgetbatteryLevel=>_battery;voiddisplayInfo(){print('Model:$model, Speed:$_currentSpeed, Battery:$_battery%');}}// 另一个实现classGasolineCarimplementsVehicle{Stringmodel;GasolineCar(this.model);@overridevoidstart(){print('$modelstarting with engine sound...');}@overridevoidstop(){print('$modelstopping...');}@overrideintgetmaxSpeed=>180;}// 使用voidmain(){Vehicletesla=ElectricCar('Tesla Model 3');tesla.start();Vehiclebmw=GasolineCar('BMW X5');bmw.start();// 类型检查if(teslaisElectric){(teslaasElectric).charge();}}三、with(混入)
详细说明
· 用于将 mixin 的功能混入到类中
· 可以混入多个 mixin
· mixin 可以包含方法和属性实现
使用场景
· 代码复用,特别是跨不同类层次结构的复用
· 避免多重继承的问题
· 实现类似"功能组合"的模式
示例代码
// 定义 mixinmixinFlyable{voidfly(){print('Flying...');}doublegetmaxAltitude=>10000;}mixinSwimmable{voidswim(){print('Swimming...');}doublegetmaxDepth=>200;}mixinWalkable{voidwalk(){print('Walking...');}doublegetspeed=>5;}// 基类classAnimal{Stringname;Animal(this.name);voidbreathe(){print('$nameis breathing');}}// 使用 with 混入多个 mixinclassDuckextendsAnimalwithWalkable,Swimmable,Flyable{Duck(Stringname):super(name);voiddoEverything(){breathe();walk();swim();fly();print('Max altitude:$maxAltitudemeters');print('Max depth:$maxDepthmeters');}}classPenguinextendsAnimalwithWalkable,Swimmable{Penguin(Stringname):super(name);voidslide(){print('$nameis sliding on ice!');}}// 使用voidmain(){varduck=Duck('Donald');duck.doEverything();varpenguin=Penguin('Pingu');penguin.swim();penguin.walk();penguin.slide();// Penguin 不能 fly()// 类型检查if(duckisFlyable){print('Duck can fly!');}if(penguinisFlyable){print('Penguin can fly!');// 不会执行}}四、on(限制混入)
详细说明
· 用于限制 mixin 只能被特定类型的类使用
· 确保 mixin 可以安全地使用宿主类的功能
使用场景
· 当 mixin 需要依赖特定基类的功能时
· 确保类型安全
· 创建专门的工具 mixin
示例代码
// 基类abstractclassAnimal{Stringname;Animal(this.name);voidmakeSound();}// 使用 on 限制只能用于 Animal 的子类mixinPetFeaturesonAnimal{Stringowner='Unknown';voidbeCute(){print('$nameis being cute for$owner');}voidplay(){makeSound();// 可以调用宿主类的方法print('$nameis playing');}}// 正确的使用classDogextendsAnimalwithPetFeatures{Dog(Stringname):super(name);@overridevoidmakeSound(){print('$namesays: Woof!');}voidfetch(){print('$nameis fetching the ball');}}// 错误的使用(编译错误)// class Car with PetFeatures { } // 错误:Car 不是 Animal// 使用voidmain(){vardog=Dog('Buddy')..owner='John'// 来自 PetFeatures..beCute()// 输出: Buddy is being cute for John..play()// 输出: Buddy says: Woof! \n Buddy is playing..fetch();}五、abstract(抽象)
详细说明
· 用于声明抽象类和抽象方法
· 抽象类不能被实例化
· 抽象方法没有实现,必须在子类中实现
使用场景
· 定义接口或基类
· 强制子类实现特定方法
· 提供部分实现,让子类完成细节
示例代码
// 抽象类abstractclassShape{Stringcolor;Shape(this.color);// 抽象方法 - 没有实现doublearea();// 具体方法 - 有实现voiddescribe(){print('This is a$colorshape');}// 抽象 getterStringgetshapeType;}// 实现抽象类classCircleextendsShape{double radius;Circle(Stringcolor,this.radius):super(color);@overridedoublearea(){return3.14159*radius*radius;}@overrideStringgetshapeType=>'Circle';// 新增方法doublegetcircumference=>2*3.14159*radius;}classRectangleextendsShape{double width;double height;Rectangle(Stringcolor,this.width,this.height):super(color);@overridedoublearea(){returnwidth*height;}@overrideStringgetshapeType=>'Rectangle';doublegetperimeter=>2*(width+height);}// 使用voidmain(){// Shape shape = Shape('red'); // 错误:不能实例化抽象类Shapecircle=Circle('red',5.0);print('${circle.shapeType}area:${circle.area()}');// 输出: Circle area: 78.53975circle.describe();Shaperectangle=Rectangle('blue',4.0,6.0);print('${rectangle.shapeType}area:${rectangle.area()}');// 输出: Rectangle area: 24.0// 类型检查List<Shape>shapes=[circle,rectangle];for(varshapeinshapes){print('${shape.shapeType}- Area:${shape.area()}');}}六、mixin(混入类)
详细说明
· 用于定义可复用的代码片段
· 类似于抽象类,但不能有构造函数
· 可以通过 with 关键字混入到其他类中
使用场景
· 创建可复用的功能模块
· 实现类似多继承的效果
· 跨类层次共享代码
示例代码
// 定义 mixinmixinLogger{voidlog(Stringmessage){print('LOG [${DateTime.now()}]:$message');}voiderror(Stringmessage){print('ERROR [${DateTime.now()}]:$message');}}mixinValidator{boolisValidEmail(Stringemail){returnRegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(email);}boolisValidPhone(Stringphone){returnRegExp(r'^[0-9]{10,}$').hasMatch(phone);}}mixinCacheManager{finalMap<String,dynamic>_cache={};voidcache(Stringkey,dynamicvalue){_cache[key]=value;}dynamicgetFromCache(Stringkey){return_cache[key];}voidclearCache(){_cache.clear();}}// 使用 mixinclassUserServicewithLogger,Validator,CacheManager{voidregisterUser(Stringemail,Stringphone){// 使用 Validator 的功能if(!isValidEmail(email)){error('Invalid email:$email');return;}if(!isValidPhone(phone)){error('Invalid phone:$phone');return;}// 使用 Logger 的功能log('Registering user:$email');// 使用 CacheManager 的功能cache('last_registered_email',email);print('User registered successfully');}voidshowLastUser(){varemail=getFromCache('last_registered_email');if(email!=null){print('Last registered user:$email');}}}// 另一个类使用部分 mixinclassOrderServicewithLogger,CacheManager{voidcreateOrder(StringorderId){log('Creating order:$orderId');cache('current_order',orderId);}}// 使用voidmain(){varuserService=UserService();userService.registerUser('test@example.com','1234567890');userService.showLastUser();varorderService=OrderService();orderService.createOrder('ORD12345');// mixin 的实例是独立的print(userService.getFromCache('current_order'));// nullprint(orderService.getFromCache('last_registered_email'));// null}七、factory(工厂构造函数)
详细说明
· 用于创建灵活的构造函数
· 可以返回缓存实例、子类实例或其他对象
· 不一定每次调用都创建新实例
使用场景
· 单例模式
· 缓存对象
· 根据条件返回不同的子类
· 对象池模式
示例代码
// 1. 单例模式classSingleton{staticSingleton?_instance;// 私有构造函数Singleton._internal(){print('Singleton created');}// 工厂构造函数factorySingleton(){_instance??=Singleton._internal();return_instance!;}voiddoSomething(){print('Doing something...');}}// 2. 缓存实例classConnection{finalStringhost;finalint port;staticfinalMap<String,Connection>_cache={};// 私有构造函数Connection._(this.host,this.port);// 工厂构造函数factoryConnection(Stringhost,int port){Stringkey='$host:$port';if(_cache.containsKey(key)){print('Returning cached connection');return_cache[key]!;}else{print('Creating new connection');finalconnection=Connection._(host,port);_cache[key]=connection;returnconnection;}}voidconnect(){print('Connected to$host:$port');}}// 3. 返回子类实例abstractclassAnimal{Stringname;Animal(this.name);voidmakeSound();// 工厂构造函数factoryAnimal.create(Stringtype,Stringname){switch(type.toLowerCase()){case'dog':returnDog(name);case'cat':returnCat(name);case'bird':returnBird(name);default:throwArgumentError('Unknown animal type:$type');}}}classDogimplementsAnimal{@overrideStringname;Dog(this.name);@overridevoidmakeSound(){print('$namesays: Woof!');}}classCatimplementsAnimal{@overrideStringname;Cat(this.name);@overridevoidmakeSound(){print('$namesays: Meow!');}}classBirdimplementsAnimal{@overrideStringname;Bird(this.name);@overridevoidmakeSound(){print('$namesays: Tweet!');}}// 4. 从 JSON 创建对象classUser{finalStringid;finalStringname;finalint age;User(this.id,this.name,this.age);// 工厂构造函数factoryUser.fromJson(Map<String,dynamic>json){returnUser(json['id']??'',json['name']??'Unknown',json['age']??0,);}// 命名构造函数(对比)User.fromMap(Map<String,dynamic>map):id=map['id']??'',name=map['name']??'Unknown',age=map['age']??0;@overrideStringtoString()=>'User(id:$id, name:$name, age:$age)';}// 使用voidmain(){// 1. 单例模式print('=== Singleton Example ===');vars1=Singleton();vars2=Singleton();print('s1 and s2 are same instance:${identical(s1,s2)}');s1.doSomething();// 2. 缓存实例print('\n=== Connection Cache Example ===');varconn1=Connection('localhost',8080);varconn2=Connection('localhost',8080);varconn3=Connection('example.com',443);print('conn1 and conn2 are same:${identical(conn1,conn2)}');print('conn1 and conn3 are same:${identical(conn1,conn3)}');// 3. 返回子类实例print('\n=== Animal Factory Example ===');Animaldog=Animal.create('dog','Buddy');Animalcat=Animal.create('cat','Whiskers');Animalbird=Animal.create('bird','Tweety');dog.makeSound();cat.makeSound();bird.makeSound();// 4. JSON 反序列化print('\n=== JSON Factory Example ===');varjson={'id':'123','name':'Alice','age':30};varuser1=User.fromJson(json);varuser2=User.fromMap(json);print('Factory constructor:$user1');print('Named constructor:$user2');}八、综合示例
// 综合使用所有关键字abstractclassAnimal{Stringname;Animal(this.name);voidmakeSound();voidsleep(){print('$nameis sleeping');}}mixinFlyableonAnimal{voidfly(){print('$nameis flying');}}mixinSwimmable{voidswim(){print('Swimming');}}classBirdextendsAnimalwithFlyable{double wingspan;Bird(Stringname,this.wingspan):super(name);@overridevoidmakeSound(){print('$namesays: Tweet!');}// 工厂构造函数factoryBird.create(Stringtype,Stringname){switch(type){case'eagle':returnEagle(name);case'penguin':returnPenguin(name);default:returnBird(name,0.5);}}}classEagleextendsBird{Eagle(Stringname):super(name,2.0);@overridevoidmakeSound(){print('$namesays: Screech!');}}classPenguinextendsBirdwithSwimmable{Penguin(Stringname):super(name,0.3);@overridevoidmakeSound(){print('$namesays: Honk!');}}voidmain(){// 使用工厂构造函数Birdbird1=Bird.create('eagle','Eddie');Birdbird2=Bird.create('penguin','Pingu');bird1.makeSound();bird1.fly();bird2.makeSound();// bird2.fly(); // Penguin 没有 with Flyableif(bird2isSwimmable){(bird2asSwimmable).swim();}// 多态List<Animal>animals=[bird1,bird2];for(varanimalinanimals){animal.makeSound();animal.sleep();}}总结对比
关键字 用途 是否强制实现 数量限制 实例化
extends 类继承 可选重写 单继承 可实例化子类
implements 接口实现 必须全部实现 多实现 可实例化实现类
with 混入功能 可选使用 多混入 可实例化
on 限制混入 - - -
abstract 定义抽象 抽象方法必须实现 - 不能实例化
mixin 定义混入类 - - 不能单独实例化
factory 工厂构造 - - 返回实例
这些关键字共同构成了 Dart/Flutter 强大的面向对象和代码复用机制。