抽象类 abstract class

抽象类不能实例化,可以当做抽象类来 extends 也可以当做接口来 implements,dart 中没有 interface 这个关键字,接口也是抽象类实现的。

  1. abstract class Animal {
  2. speak(); // 抽象方法 必须实现
  3. printInfo() { // 不需要实现
  4. print('not abstract method');
  5. }
  6. }
  7. class Dog extends Animal {
  8. @override
  9. speak() {
  10. print('wang!');
  11. }
  12. }
  13. void main() {
  14. Dog d = new Dog();
  15. d.speak(); // wang!
  16. d.printInfo(); // not abstract method
  17. }

接口

接口也是 abstrack 关键字声明的,并且需要使用 implements 关键字来实现。

  1. abstract class DB {
  2. String host;
  3. String port;
  4. String user;
  5. String pass;
  6. query(String data);
  7. update(String data);
  8. insert(String data);
  9. delete(String data);
  10. }
  11. class Mysql implements DB {
  12. @override
  13. String host;
  14. @override
  15. String pass;
  16. @override
  17. String port;
  18. @override
  19. String user;
  20. Mysql(this.host, this.user, this.pass, [this.port = '3306']) {
  21. print(
  22. '[ok] connect to ${this.host}:${this.port}, use ${this.user}:${this.pass}');
  23. }
  24. @override
  25. delete(String data) {
  26. print('delete ${data}');
  27. }
  28. @override
  29. insert(String data) {
  30. print('insert ${data}');
  31. }
  32. @override
  33. query(String data) {
  34. print('query ${data}');
  35. }
  36. @override
  37. update(String data) {
  38. print('update ${data}');
  39. }
  40. }
  41. void main() {
  42. print('---------接口------------');
  43. Mysql my = new Mysql('127.0.0.1', 'root', '123456', '3307');
  44. my.insert('121');
  45. my.update('121');
  46. my.query('121');
  47. my.delete('121');
  48. }

多接口

  1. abstract class A {
  2. fnA();
  3. }
  4. abstract class B {
  5. fnB();
  6. }
  7. class C implements A, B {
  8. @override
  9. fnA() {
  10. print('FN------A');
  11. }
  12. @override
  13. fnB() {
  14. print('FN------B');
  15. }
  16. }
  17. void main() {
  18. print('-----多接口------');
  19. print('-----dart 没有多继承------');
  20. C c = new C();
  21. c.fnA();
  22. c.fnB();
  23. }

mixin

因为没有多继承,因此如果要综合多个类属性和方法可以 implements 多个接口,如果不是抽象类,则可以通过 mixin 混入多个类的属性和方法。

  1. class A {
  2. void fnA() {
  3. print('fnA');
  4. }
  5. void run() {
  6. print('runA');
  7. }
  8. }
  9. abstract class B {
  10. void fnB() {
  11. print('fnB');
  12. }
  13. void run() {
  14. print('runB');
  15. }
  16. }
  17. class C extends Object with A, B {
  18. void fnA() {
  19. print('C_fnA');
  20. }
  21. }
  22. /**
  23. * - mixin 类只能继承自 object
  24. * - mixin 类不能有构造函数
  25. * - 一个类能够 mixin 多个 mixin 类
  26. */
  27. void main() {
  28. print('----- mixin ------');
  29. print('-----dart 没有多继承------');
  30. C c = new C();
  31. c.fnA();
  32. c.fnB();
  33. c.run();
  34. print('-----类型------');
  35. print(c is C);
  36. print(c is A);
  37. print(c is B);
  38. }

image.png