Dart中的继承和Java类似,也是单继承,多态,但操作还是有一些区别的
一、继承
继承和复写,和Java是一样的,例子如下
class Person{
String name;
int age;
String gender;
bool get isAdult => age > 18;
void run()
{
print("Person run.....");
}
}
class Student extends Person{
int age=16;
String gender;
@override
bool get isAdult //复写父类成年函数
{
return age > 15;
}
@override
void run()//复写父类run()函数
{
print("Student Run....");
}
}
void main()
{
var student = Student();
print(student.isAdult);
student.run();
}
继承之构造方法:
1、子类的方法会默认调用父类中无名无参的构造方法,这点和Java 一样。
2、如果父类中没有无名无参的方法,那么就需要用:来显示调用父类的不无名无参的构造方法
构造方法的执行顺序:初始化列表==>父类的构造方法==>子类的构造方法
class Person{
String name;
int age;
String gender;
Person(this.name);//无名有参
Person.withName(this.name);//有名有参
bool get isAdult => age > 18;
void run()
{
print("Person run.....");
}
}
class Student extends Person{
int age;
String gender;
Student(String name,String g) : gender = g, super.withName(name);//先初始化列表,再调用父类方法,最后在子类搞
}
void main()
{
var student = new Student("yue","female");//参数还是要按格式传进去
print(student.name);
}
二、多态
class Person{
String name;
int age;
String gender;
bool get isAdult => age > 18;
void run()
{
print("Person run.....");
}
@override
String toString() {
return "name is $name,age = $age";
}
}
class Student extends Person{
bool get isAdult {
return age > 15;
}
@override
void run() {
print("Student Run....");
}
}
void main()
{
Person person = new Student();//只能访问到Person里面的方法
person.name = "Yue";
person.age = 20;
if(person is Person)
{
print(person);
}
三、抽象
1、抽象类不能直接被实例化,抽象方法不用abstract实现
2、抽象类可以没有抽象方法,但有抽象方法的类一定要声明是抽象类
void main(){
var person = Student();
person.run();
}
abstract class Person{
void run();
}
class Student extends Person{
@override
void run(){
print("ok");
}
}
Dart的抽象类更像Java中的接口
然而Dart的接口和其他语言的又不太一样
四、接口
在Dart中类和接口是统一的,类就是接口。每个类都隐式地定义了一个包含所有实例成员的接口!
那么什么时候使用继承,什么时候使用接口呢?
如果是复用已有类的实现,那么使用继承;
如果只是使用已有类的外在的行为,那么使用接口。
五、Mixins
如果我们想要让一个类同时具有几个类的方法,我们第一下想到的肯定是多继承,但是Dart是没有的,所以我们就有了这个Mixin
如果我们想要让类D同时拥有类A,B,C的方法,那么我们可以这样搞一搞
void main()
{
var k = new D();
k.runa();
k.runb();
k.runc();
}
class A
{
void runa()
{
print("run...a");
}
}
class B
{
void runb()
{
print("run...b");
}
}
class C
{
void runc()
{
print("run...c");
}
}
class D extends A with B,C {//这就是Mixins,
}
可是如果不同的类有相同的名称的方法那么对象调用的时候回调用哪一个呢
答案是:Mixins最后面的那一个类,上面的例子中如果类A,B,C同时拥有名为run的函数,那么k.run()实际上调用的是C的
注意:!!!
要实现Mixins,作为Mixins的类只能继承自Object,不能声明任何的构造方法,不能调用super
六、操作符复写
类似于C++里面运算符的重载
如果要复写操作符,那么要在类中定义
void main()
{
var p1 = Person(22);
var p2 = Person(20);
print(p1 > p2);
}
class Person{
int age;
Person(this.age);
bool operator > (Person person)//重载>号运算符
{
return this.age>person.age;
}
}