Hongbo

Oct 17, 2023

关于多态(1)

前提继承(实现)、覆盖(override)、向上转型

目的:通过允许向上转型,实现动态绑定,在”不变“中实现“变化”。

原则:开闭原则。

实现:使用基类的引用或者指针,引用或者指向子类对象。这些不同的子类实现了一些基类中相同的方法,但各有自己的不同操作,在进行这些相同操作时,系统会根据实际引用和指向的对象,确定需要调用哪一个子类对象的那一个共同方法。

影响:实现了静态语言的动态绑定,解决参数传递只能传递指定类型的局限性,有利于实现开闭原则。

注意:在向上转型后,该引用不能调用子类对象独有的方法。解决方法:强制类型转换,不安全。

技术:虚函数指针,虚函数表,虚函数切片。

示例:C++,Java,Python的多态实现,Java的interface与abstract类的区别。

  • Java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    //(1)抽象类举例
    //抽象类:不能被实例化
    /*与接口的区别:包含了该类别常用的方法属性,包含已经实现的方法,不过因为其是抽象的,所以规定不能实例化。
    *方法相当于接口中的接口方法.
    *c++: 跟c++同时含有虚函数跟纯虚函数类似
    */

    public abstract class Creature {

    //吃东西
    public void eat() {
    System.out.println("Creature: eating...");
    }
    //接口
    public abstract void think();
    }

    public class human extends Creature{

    @Override
    public void think() {
    System.out.println("Human is thinking !");

    }

    }

    //测试类
    public class Test {

    public void testCreature(Creature c) {
    c.eat();
    c.think();
    }
    //测试
    public static void main(String[] args) {
    Test test =new Test();
    Human human = new Human();
    test.testCreature(human);

    }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//接口举例(3)
//接口类,只声明方法,不实现,子类必须全部实现
public interface People {
//讲话
public void speak();
//睡觉
public void sleep();
}

//男人类
public class Man implements People {

@Override
public void speak() {
System.out.println("Man speaks!");
}

@Override
public void sleep() {
System.out.println("Man sleeps!");
}

//自己的方法
public void eat() {
System.out.println("Man eats");
}
}

//女人类
public class Woman implements People {

@Override
public void speak() {
System.out.println("Woman speaks!");
}

@Override
public void sleep() {
System.out.println("Woman sleeps!");
}
//自己的方法
public void eat() {
System.out.println("Woman eats");
}
}

//测试类
public class Test {
public void testPeople(People p) {
p.sleep();
p.speak();
// p.eat() //报错,不能调用子类独有的方法
}
//测试
public static void main(String[] args) {
Test test =new Test();

Man man= new Man();
test.testPeople(man);

Woman woman=new Woman();
test.testPeople(woman);

}
}

OLDER > < NEWER