06 Tính đa hình, đa thừa kế trong java

download 06 Tính đa hình, đa thừa kế trong java

of 40

Transcript of 06 Tính đa hình, đa thừa kế trong java

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    1/40

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    2/40

    K tha v a hnh 2Nguyn Vit H

    Ni dung

    a hnhupcasting

    lin kt ng

    Lp v phng thc tru tng a k tha v giao din

    Mt cch lp trnh tng qut

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    3/40

    K tha v a hnh 3Nguyn Vit H

    Ti liu tham kho

    Thinking in Java, chapter 7, 8 Java how to program, chapter 9

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    4/40

    K tha v a hnh 4Nguyn Vit H

    Polymorphism (a hnh) l g

    Polymorphism: nhiu hnh thc, nhiu kiutn ti

    a hnh trong lp trnh

    a hnh hm: hm trng tn, phn bit bidanh sch tham s

    a hnh i tng nhn nhn i tng theo nhiu kiu khc nhau cc i tng khc nhau gii ngha thng ip

    theo cch thc khc nhau

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    5/40

    K tha v a hnh 5Nguyn Vit H

    Up casting

    Up casting l kh nng nhn nhn itng thuc lp dn xut nh l mt itng thuc lp c s

    dng i tng ca lp dn xut truyntham s

    dng i tng ca lp dn xut lm thuc

    tnh

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    6/40

    K tha v a hnh 6Nguyn Vit H

    Person p;

    Employee e = new Employee();

    p = (Person) e;

    p.setName(...);

    p.setSalary(...); // compile error

    Person

    -name

    -birthday

    +setName()

    +setBirthday()

    Employee

    -salary

    +setSalary()

    +getDetail()

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    7/40

    K tha v a hnh 7Nguyn Vit H

    String teamInfo(Person p1, Person p2) {

    return "Leader: " + p1.getName() +

    "; member: " + p2.getName();

    }

    ...Employee e1, e2;

    Manager m1, m2;

    System.out.println(teamInfo(e1, e2));

    teamInfo(m1, m2); teamInfo(m1,e2);

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    8/40

    K tha v a hnh 8Nguyn Vit H

    class Manager extends Employee {

    Employee assistant;

    ...

    public void setAssistant(Employee e) {

    assistant = e;

    }

    ...

    }

    ...

    Manager junior, senior;

    ...

    senior.setAssistant(junior);

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    9/40

    K tha v a hnh 9Nguyn Vit H

    a hnh v lin kt ng

    Kh nng gii ngha cc thng ip theo cc cch thc

    khc nhau

    Person p1 = new Person();

    Person p2 = new Employee();Person p3 = new Manager();

    ...

    System.out.println(p1.getDetail());System.out.println(p2.getDetail());

    System.out.println(p3.getDetail());

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    10/40

    K tha v a hnh 10Nguyn Vit H

    class EmployeeList {

    Employee list[];

    ...

    public void add(Employee e) {...}

    public void print() {for (int i=0; i

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    11/40

    K tha v a hnh 11Nguyn Vit H

    Lin kt tnh v lin kt ngStatic and dynamic binding

    Lin kt tnh: li gi hm (phng thc) cquyt nh khi bin dch, do chc mt phinbn ca chng trnh con c thc hin u im v tc

    Lin kt ng: li gi phng thc c quytnh khi thc hin, phin bn ca phng thcph hp vi i tng c gi Java mc nh s dng lin kt ng

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    12/40

    K tha v a hnh 12Nguyn Vit H

    Down casting

    Employee e = new Employee();

    Person p = e; // up casting

    Employee ee = (Employee)p; // down casting

    Manager m = (Manager)ee; // run-time error

    Person p2 = new Manager();

    Employee e2 = (Employee) p2;

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    13/40

    K tha v a hnh 13Nguyn Vit H

    Ton t instanceof

    public class Employee extends Person {}

    public class Student extends Person {}

    ---

    public doSomthing(Person e) {

    if (e instanceof Employee) {...

    } else if (e instanceof Student) {...

    } else {...}

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    14/40

    K tha v a hnh 14Nguyn Vit H

    Private method

    class Base {

    private void f() { System.out.println(base f()); }

    public void show() { f() }

    }

    public class Derived extends Base {

    private void f() {

    System.out.println(derived f());

    }

    public static void main(String args[]) {

    Derived d = new Derived();

    Base b = d;

    b.show();

    }

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    15/40

    K tha v a hnh 15Nguyn Vit H

    Copy constructor(?)

    class Employee extends Person {

    double salary;

    Employee(Employee e) {

    super(e);salary = e.salary;

    }

    ...

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    16/40

    K tha v a hnh 16Nguyn Vit H

    Gi phng thc trong constructorclass Shape {

    public Shape() {

    draw();

    }public void draw() {}

    }

    class Point extends Shape {

    protected int x, y;

    public Point(int xx, int yy) {

    x = xx; y = yy;

    }

    public void draw() {

    System.out.println("(" + x + "," + y + ")");

    }}

    --

    Point p = new Point(10, 10);

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    17/40

    K tha v a hnh 17Nguyn Vit H

    Lp tru tng

    Chng ta c th to ra cc lp c sti s dng m khng mun to ra itng thc ca lp

    cc lp Point, Circle, Rectangle chung nhaukhi nim cng l hnh v Shape

    Gii php l khi bo lp tru tng

    khng th to i tng

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    18/40

    K tha v a hnh 18Nguyn Vit H

    abstract class Shape {

    protected int x, y;

    Shape(int _x, int _y) {

    x = _x;

    y = _y;

    }

    }

    ...

    Shape s1 = new Circle();

    Shape s = new Shape(10, 10) // compile error

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    19/40

    K tha v a hnh 19Nguyn Vit H

    class Circle extends Shape {int r;

    public Circle(int _x, int _y, int _r) {super(_x, _y);

    r = _r;

    }...

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    20/40

    K tha v a hnh 20Nguyn Vit H

    Phng thc tru tng

    thng nht giao din, c th khai bocc phng thc ti lp c s nhngc ci t thc t ti lp dn xut

    cc lp dn xut khc nhau c cch ci tkhc nhau

    Phng thc tru tng

    bt buc phi nh ngha li ti lp dn xut

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    21/40

    K tha v a hnh 21Nguyn Vit H

    abstract class Shape {protected int x, y;

    public void moveTo(int x1, int y1) {

    erase();x = x1;

    y = y1;

    draw();

    }

    abstract public void erase();

    abstract public void draw();

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    22/40

    K tha v a hnh 22Nguyn Vit H

    class Circle extends Shape {int r;

    public Circle(int _x, int _y, int _r) {

    super(_x, _y);

    r = _r;

    draw();

    }

    public void erase() {

    System.out.println("Erase at (" + x + "," + y + ")");

    }

    public void draw() {

    System.out.println("Draw at (" + x + "," + y + ")");

    }

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    23/40

    K tha v a hnh 23Nguyn Vit H

    Giao din (Interface)

    Interface l mc tru tng cao hn lptru tng

    Bao gm

    phng thc tru tnghng s (static final)

    mc nh l public

    C php:

    t kha interface v implements

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    24/40

    K tha v a hnh 24Nguyn Vit H

    interfaceAction {

    void moveTo(int x, int y);

    void erase();

    void draw();

    }

    class Circle1 implements Action {

    int x, y, r;

    Circle1(int _x, int _y, int _r) { ... }

    public void erase() {...}

    public void draw() {...}

    public void moveTo(int x1, int y1) {...}

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    25/40

    K tha v a hnh 25Nguyn Vit H

    Lp tru tng ci t giao dinabstract class Shape implements Action {

    protected int x, y;

    public Shape() {...}

    public Shape(int _x, int _y) {...}

    public void moveTo(int x1, int y1) {

    erase();

    x = x1;

    y = y1;

    draw();

    }

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    26/40

    K tha v a hnh 26Nguyn Vit H

    a k tha Java khng cho php a k tha t nhiu lp c s

    m bo tnh d hiu hn ch xung t

    C th ci t ng thi nhiu giao din

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    27/40

    K tha v a hnh 27Nguyn Vit H

    class ImageBuffer {...

    }

    class Animation extends ImageBuffer

    implementsAction {

    ...

    public void erase() {...}

    public void draw() {...}

    public void moveTo() {...}

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    28/40

    K tha v a hnh 28Nguyn Vit H

    interface CanFight {voidfight();

    }

    interface CanSwim {voidswim();

    }

    interface CanFly {

    voidfly();

    }

    classActionCharacter {

    public voidfight() {}

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    29/40

    K tha v a hnh 29Nguyn Vit H

    class Hero extendsActionCharacter implements CanFight, CanSwim,

    CanFly {

    public voidswim() {}

    public voidfly() {}

    }

    public classAdventure {

    public static voidt(CanFight x) { x.fight(); }

    public static voidu(CanSwim x) { x.swim(); }

    public static voidv(CanFly x) { x.fly(); }

    public static voidw(ActionCharacter x) { x.fight(); }public static voidmain(String[] args) {

    Hero h = new Hero();

    t(h); // Treat it as a CanFight

    u(h); // Treat it as a CanSwim

    v(h); // Treat it as a CanFly

    w(h); // Treat it as an ActionCharacter

    }

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    30/40

    K tha v a hnh 30Nguyn Vit H

    Xung t (1)interface I1 { voidf(); }

    interface I2 { int f(int i); }

    interface I3 { int f(); }

    class C {

    public int f() { return 1; }

    }

    class C2 implements I1, I2 {

    public voidf() {}

    public int f(int i) { return 1; } // overloaded

    }class C3 extends C implements I2 {

    public int f(int i) { return 1; } // overloaded

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    31/40

    K tha v a hnh 31Nguyn Vit H

    Xung t (2)class C4 extends C implements I3 {

    // Identical, no problem:

    public int f() { return 1; }

    }

    class C5 extends C implements I1 {}

    interface I4 extends I1, I3 {}

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    32/40

    K tha v a hnh 32Nguyn Vit H

    M rng lp tru tng v giao din

    interface I1 {}

    interface I2 {}

    interface I3 extends I1, I2 {}

    abstract class A1 {}

    abstract class A2 extendsA1 implements I1, I2 {}

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    33/40

    K tha v a hnh 33Nguyn Vit H

    Abstract class vs. Interface

    Lp tru tng c th c phng thcthc v thuc tnh

    Interface h tra k tha

    Ci g l bt bin ?

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    34/40

    K tha v a hnh 34Nguyn Vit H

    Hng ti lp trnh tng qutGeneric programming

    Tng qut ha chng trnh c th hot ng

    vi cc kiu d liu khc nhau, k c cc kiud liu trong tng lai thut ton xc nh

    V d, kiu ngn xp C: dng con tr void

    C++: dng template

    Java: li dng upcasting v lp gc Object Java 1.5: template

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    35/40

    K tha v a hnh 35Nguyn Vit H

    class MyStack {

    ...

    public void push(Object obj) {...}

    public Object pop() {...}

    }

    ...

    MyStack s = new MyStack();

    Point p = new Point();Circle c = new Circle();

    s.push(p);

    s.push(c);

    Circle c1 = (Circle) s.pop();Point p1 = (Point) s.pop();

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    36/40

    K tha v a hnh 36Nguyn Vit H

    Local copy

    C nhu cu sao chp cc i tngSao chp khi chuyn tham s trnh sai i tng gc

    Lm th no sao chp i tng mkhng bit r kiu (lp) thc s ca n?S dng copy constructor?

    S dng phng thc copy? Interface Cloneable v phng thcclone()

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    37/40

    K tha v a hnh 37Nguyn Vit H

    Copy constructorclass Base {

    public Base() {}

    public Base(Base b) {...}public String print() { return "base class"; };

    }

    class Derived extends Base {

    public Derived() {}public Derived(Derived d) {

    super(d);

    }

    public String print() { return "derived class"; };}

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    38/40

    K tha v a hnh 38Nguyn Vit H

    Local copy s dng copy constructorpublic class TestCopy {

    static void copy(Derived d) {

    Derived d1 = new Derived(d);

    System.out.println(d1.print());

    }

    static void copy2(Base b) {

    Base b1 = new Base(b);

    System.out.println(b1.print());

    }

    public static void main(String args[]) {

    Derived d = new Derived();

    copy(d);

    copy2(d);

    }

    }

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    39/40

    K tha v a hnh 39Nguyn Vit H

    Bi tp S dng kin thc v k tha v a hnh thit k cc lp sauCc lp i tng hnh hc c s Point,

    Circle, Rectange, ...

    Lp Graphics l mt hnh phc hp do ngidng nh ngha (l mt tp cc hnh c shoc phc hp khc)

    Yu cu: cc lp phi s dng giao dinnh nhau: move(), draw(),

  • 7/31/2019 06 Tnh a hnh, a tha k trong java

    40/40

    K tha v a hnh 40Nguyn Vit H

    Composite design pattern