2011-08-25 22 views
6

Thỉnh thoảng, tôi bắt gặp một số thiết kế lớp học như sau.Mục đích có con trừu tượng bằng cách mở rộng phụ huynh cụ thể

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Do something. 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

tôi đã tự hỏi, mục đích của việc có một lớp abstract_dog là gì? Tại sao chúng ta "biến đổi" phương pháp nói không trừu tượng thành trừu tượng nói lại?

+0

Lưu ý: nếu bạn kiểm soát phân cấp lớp, cách tiếp cận tốt hơn sẽ là loại bỏ lớp chó cụ thể hoàn toàn hoặc có lớp con abstract_dog. Thích làm cho các lớp không lá trừu tượng. –

Trả lời

4

Trong trường hợp bạn muốn tạo lớp cơ sở buộc mọi người ghi đè speak, nhưng kế thừa Dog.

+0

Trong khi câu trả lời của bạn là chính xác về mặt kỹ thuật, tôi vẫn xem xét mã này, nếu tôi gặp nó trong khi xem xét .. (Vẫn +1) – nfechner

+0

@nfechner: Điều đó hoàn toàn phụ thuộc vào tình huống cụ thể. Tôi nghĩ tôi cần phải làm điều này một cách chính xác trong hơn 5 năm phát triển. – SLaks

+0

+1 vì lý do đơn giản, mặc dù câu trả lời của bạn (cũng như câu hỏi) thiếu một số tình huống thực tế. –

0

Tôi đồng ý với SLaks, và nghĩ rằng đây sẽ là một tình huống thực tế đời sống:

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Dog says 'bark' 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

class poodle extends abstract_dog { 
    @Override 
    public void speak() { 
     // poodle says 'yip yip' 
    } 
} 

class great_dane extends abstract_dog { 
    @Override 
    public void speak() { 
     // great dane says 'ruff ruff' 
    } 
} 

Tôi nghĩ rằng bạn sẽ sử dụng này trong trường hợp bạn muốn làm cho một lớp trẻ mới thực hiện phương pháp speak và lớp dog có thể có các phương thức khác mà lớp con mới sẽ không phải thực hiện.
Biết thêm về tình huống chính xác của bạn sẽ giúp xác định xem có thiết kế tốt hơn cho trường hợp này hay không.

+0

Nhưng bạn cũng có thể bỏ qua abstract_dog trong ví dụ này. – Buhb

+0

@ Buhb, điều đó đúng, và đó là một vấn đề tiềm năng với thiết kế này. – rosscj2533

Các vấn đề liên quan