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

Upload: tran-huu-thang

Post on 05-Apr-2018

241 views

Category:

Documents


0 download

TRANSCRIPT

  • 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