Dart-抽象类(用于定义规范) 多态(父类对象可以指向子类实现) 接口(用于定义公用方法) Mixins

抽象类

主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口

抽象方法不能用abstract,没有方法体的方法就是抽象方法

如果子类继承抽象类,必须实现里面的抽象方法

如果把抽象类当做接口实现,必须实现里面的所有属性和方法

抽象类不能被实例化,只有继承他的子类可以

Extends和implements的区别

如果要复用抽象类里的方法,并且要用抽象方法约束子类的话就用

extends

如果只是把抽象类当做标准,就用implements

继承必须实现抽象方法


```dart
abstract class Animal{

 eat();//抽象方法
 walk(){}//带{}的是普通方法

}

class Dog extends Animal{

  @override

  eat() {

    print("hello,dog");

  }

多态

允许将子类型的指针赋值给父类型的指针
同一个函数调用会有不同结果
多态就是父类定义一个方法不去实现,让继承的子类去实现,
每个子类有不同表现
比如eat()
Animal c=new Dog(); //子类型指针赋值给父类型
c.eat();

接口–定义公用方法

没有interface关键字,普通类和抽象类都可以作为接口
用implements实现
但因为普通类不可以定义抽象方法,所以接口一般用抽象类
必须实现里面的所有属性和方法

abstract class Db{//当做接口
String uri="";
add(String data);
save();
delete();
}
class MySql implements Db{
  @override
  add(String data) {
   print("add success,$data");
  }

  @override
  delete() {
   
  }

  @override
  save() {
   
  }
  
  @override
  String uri;
  MySql(this.uri);

}

main(){
MySql mySql=new MySql("hello,url");
mySql.add("hhh");

}

实现多个接口

class C implements A,B{}

Mixins

在类中混入其他功能
要求一致在变
1)继承自object
2)不能有构造函数
3)一个类可以mixins多个mixins类
4)mixins不是继承,也不是接口

class Animal{
   String name="";
   int age=0;
   Animal(String name,int age);
   printInfo(){
    print("我是animal");
   }
    void run(){
    print("animal在飞翔");
  }

}

class A{
  void printA(){
    print("A");
  }
  void run(){
    print("a在跑步");
  }
}

class B{
  void printB(){
    print("B");
  }
   void run(){
    print("b在游泳");
  }
}

class C extends Animal with A,B {
  //mixin  A ,B 必须是顶级类,不能是其他类
                  //A,B不能有构造函数
                  C(super.name, super.age);//因为继承了animal有参构造

}

void main(List<String> args) {
  C c=new C("李白",99);
  c.printInfo();
  c.printA();
  c.printB();
  c.run();//取决于extends   with后面的顺序,使用后者 // b在游泳  
  print(c is A);  //true 相当于A B animal都是c的超类
  print(c is B ); //true
  print(c is Animal );//true  
}
<think>我们正在讨论Dart语言中类的多态性用法。多态是面向对象编程的三大特性之一,它允许我们使用父类的引用指向子类对象,并在运行时根据实际的对象类型调用相应的方法。这样,我们可以编写出更通用、更灵活的代码。 根据提供的引用,我们可以总结Dart多态的使用方法如下: 1. **定义抽象类父类**:首先需要定义一个抽象类(使用`abstract`关键字)或一个普通父类,其中声明一些方法(可以是抽象方法,也可以有默认实现)。抽象方法没有方法体,必须在子类中被实现。 2. **创建子类**:创建继承自抽象类父类子类,并实现父类定义的抽象方法(如果父类中有抽象方法)。子类可以根据需要提供不同的实现。 3. **使用父类引用指向子类对象**:在代码中,我们可以声明一个父类类型的变量,然后将其指向一个子类对象。这样,通过这个父类引用调用方法时,实际执行的是子类中重写的方法。 下面通过一个具体的例子来说明: ```dart // 定义一个抽象类Animal abstract class Animal { void eat(); // 抽象方法,没有方法体 } // 子类Cat class Cat extends Animal { @override void eat() { print('Cat eating...'); } } // 子类Dog class Dog extends Animal { @override void eat() { print('Dog eating...'); } } // 一个接收Animal类型参数的函数 void feedAnimal(Animal animal) { animal.eat(); // 这里会调用具体子类的eat方法 } void main() { var cat = Cat(); var dog = Dog(); feedAnimal(cat); // 输出: Cat eating... feedAnimal(dog); // 输出: Dog eating... } ``` 在这个例子中: - `Animal`是一个抽象类,它定义了一个抽象方法`eat`。 - `Cat`和`Dog`是`Animal`的子类,它们分别实现了`eat`方法,提供了不同的行为。 - 函数`feedAnimal`接收一个`Animal`类型的参数。当我们传递`Cat`对象时,它调用`Cat`的`eat`方法;传递`Dog`对象时,它调用`Dog`的`eat`方法。这就是多态的体现:同一个函数调用,根据传入的对象不同,执行不同的操作。 **多态的好处**: - 提高代码的可扩展性和可维护性。如果需要添加新的动物类型,只需要创建新的子类实现`eat`方法,而无需修改`feedAnimal`函数。 - 使代码更符合现实世界的逻辑,因为不同的对象对同一消息可以有不同的响应。 此外,在Dart中,多态也可以与接口结合使用。Dart接口是通过抽象类来隐式定义的,一个类可以实现多个接口(即多个抽象类),从而具备多种行为。例如: ```dart // 定义两个接口 abstract class Flyable { void fly(); } abstract class Swimmable { void swim(); } // Bird类实现两个接口 class Bird implements Flyable, Swimmable { String name; Bird(this.name); @override void fly() { print('$name is flying!'); } @override void swim() { print('$name is swimming!'); } } void main() { Bird bird = Bird('Sparrow'); bird.fly(); // 输出: Sparrow is flying! bird.swim(); // 输出: Sparrow is swimming! } ``` 在这个例子中,`Bird`类实现了`Flyable`和`Swimmable`两个接口,因此它必须实现这两个接口定义的所有方法。这样,`Bird`对象就可以被当作`Flyable`或`Swimmable`类型来使用,这也是多态的一种应用。 总结:在Dart中,多态的使用主要依赖于继承和接口实现。通过父类引用指向子类对象,我们可以编写出通用的代码,而具体的行为由子类决定。 §§相关问题§§ 1. Dart抽象类接口有什么区别? 2. 在Dart中如何实现多个接口? 3. 多态Dart中的实际应用场景有哪些? 4. 除了多态Dart中面向对象编程的其他两大特性(封装和继承)如何实现?</think>### Dart 中类的多态性用法详解 多态是面向对象编程的核心特性之一,在 Dart 中通过**父类引用指向子类对象**实现。其核心机制是:**编译时类型为父类,运行时类型为子类**,系统自动调用实际子类方法实现。以下是具体使用方法: #### 1. **定义抽象类与抽象方法** ```dart abstract class Animal { void eat(); // 抽象方法(无方法体) void move() => print("Moving"); // 可包含具体方法 } ``` #### 2. **子类实现多态** ```dart class Cat extends Animal { @override void eat() => print("Cat eats fish"); // 实现抽象方法 void purr() => print("Purring"); // 子类特有方法 } class Dog extends Animal { @override void eat() => print("Dog eats bone"); // 不同实现 } ``` #### 3. **多态调用示例** ```dart void feedAnimal(Animal animal) { animal.eat(); // 动态绑定到实际子类方法 // animal.purr(); // 错误!父类引用无法访问子类特有方法 } void main() { Animal myPet = Cat(); // 父类引用指向子类对象 feedAnimal(myPet); // 输出: "Cat eats fish" myPet = Dog(); // 指向不同子类对象 feedAnimal(myPet); // 输出: "Dog eats bone" [^1] } ``` #### 关键特性: 1. **动态绑定** 方法调用在运行时根据对象实际类型确定,如`animal.eat()`实际调用`Cat.eat()`或`Dog.eat()`。 2. **向上转型限制** 父类引用只能访问: - 父类声明的方法 - 子类重写的父类方法 *无法直接调用子类特有方法(如`purr()`)*。 3. **向下转型(需显式)** ```dart if (myPet is Cat) { myPet.purr(); // 输出: "Purring" } ``` #### 多态的优势: - **代码扩展性**:新增子类(如`Bird`)无需修改`feedAnimal`函数[^2] - **接口统一**:不同子类对象可用相同父类类型处理 - **解耦设计**:业务逻辑依赖抽象(Animal),而非具体实现 #### 实际应用场景 1. **插件系统**:定义统一接口,不同插件实现具体功能 2. **UI组件库**:基础组件类声明`render()`,不同组件重写渲染逻辑 3. **算法策略**:抽象策略接口,运行时切换具体算法实现[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i7i8i9com

大家共赴星际梦想

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值