30/09/2018, 21:53

Overide thuộc tính trong Java

Mọi người cho em hỏi có cách nào để Overide thuộc tính của lớp cha ở lớp con không ạ?
kiểu như:

class Parent {
       int Age = 50;
.....
}
class Child extends Parent {
       int Age = 10;
.....
}
ở hàm Main ta khai báo:
....main(...)
{
       Parent ojb = new Child();

     system.out.print("Tuoi : " + ojb.Age);
}

làm thế nào để vẫn giữ câu lệnh Parent ojb = new Child(); mà vẫn in ra được: Tuoi: 10 được không ạ?
em cám ơn!

Nguyen Ca viết 23:57 ngày 30/09/2018

1: Sai ve nguyên tắc. Parrent có Age rồi cái con có age nữa là gi.
2.Muốn làm cũng được, thêm hàm getAge ở supper class và subclass. Tìm hiểu thêm về đa hình.

Tao Không Ngu. viết 00:01 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

Tâm Ninja viết 00:02 ngày 01/10/2018

Class Parent:

class Parent {
    int age;

    public Parent() {
        age = 50;
    }
}

Class Child:

class Child extends Parent {
    public Child() {
        age = 10;
    }
}

Cách trên có một vấn đề là khi viết như sau thì giá trị khởi tạo mặc định của class con hoặc cha có thể bị bỏ qua nếu làm việc team và không thống nhất spec:

class Child extends Parent {
    int height;

    public Child(int height) {
        this.height = height;
    }
}

Thông thường mình sẽ code như sau không biết có hợp lý không:

Class Parent:

class Parent {
    int age;
    String location;

    public Parent() {
        init();
    }

    private void init {
        age = 50;
        location = "Ha Noi";
    }
}

Class Child:

class Child extends Parent {
    int height;

    public Child() {
        init();
    }

    public Child(int height) {
        init();
        this.height = height;
    }

    private void init() {
        age = 10;
        location = "Ha Noi";
    }
}

Tuy nhiên cách trên lại vấp phải một vấn đề là mỗi lần sửa giá trị location thì phải nhớ đến cả cha lẫn con. Quên mất là degrade debug lỗi lòi mắt.

Class Parent:

class Parent {
    public static final int DEFAULT_PARENT_AGE = 50;
    public static final String DEFAULT_PARENT_LOCATION = "Ha Noi";

    int age;
    String location;

    public Parent() {
        init();
    }

    private void init {
        age = DEFAULT_PARENT_AGE;
        location = DEFAULT_PARENT_LOCATION;
    }
}

Class Child:

class Child extends Parent {
    public static final int DEFAULT_CHILD_AGE = 10;
    int height;

    public Child() {
        init();
    }

    public Child(int height) {
        init();
        this.height = height;
    }

    private void init() {
        age = DEFAULT_CHILD_AGE;
        location = DEFAULT_PARENT_LOCATION;
    }
}

Hi vọng có ích.

Reoteu Ray viết 23:54 ngày 30/09/2018

mình thì nghĩ cứ thuộc tính cho nó private hết , sau đó khai báo seter/geter , chứ nếu viết mà không xác định các quyền truy cập cho nó thì đã bỏ qua mất tính bao đóng của OOP rồi…

Bài liên quan
0