Định nghĩa một lớp trừu tượng mà không có bất kỳ phương thức trừu tượng nào


114

Tôi có thể định nghĩa một lớp trừu tượng mà không cần thêm một phương thức trừu tượng không?


1
Một ví dụ điển hình có thể được tìm thấy trong decorator pattern, xem tại đây . Cả hai WindowDecoratorCoffeeDecoratorđều là abstractcác lớp, nhưng không bao gồm một abstractphương thức.
MS Dousti

Câu trả lời:


168

Tất nhiên.

Khai báo một lớp trừu tượng chỉ có nghĩa là bạn không cho phép nó được khởi tạo một mình.

Khai báo một phương thức trừu tượng nghĩa là các lớp con phải cung cấp một triển khai cho phương thức đó.

Cả hai là những khái niệm riêng biệt, mặc dù rõ ràng là bạn không thể có một phương thức trừu tượng trong một lớp không trừu tượng. Bạn thậm chí có thể có các lớp trừu tượng với finalcác phương thức nhưng không bao giờ ngược lại.


14

Có, bạn có thể làm điều đó. Tại sao bạn không thử làm điều đó?


6
Và nó không chỉ là OP. Nhìn vào tất cả các phiếu bầu mà câu hỏi đã nhận được!
Marc W

54
@ karim79 Không cần cao ngựa và tất cả những thứ đổ nước sốt đó. Dùng thử không hoàn toàn tiết lộ lý do tại sao nó được phép, trong khi hỏi nó có thể.
biziclop

7
@bizclop - Tự mình thử có thể sẽ mang lại một câu hỏi hiệu quả hơn. Không có ngựa cao. Việc này thật thẳng thắn. Câu hỏi của anh ấy là 'Tôi có thể không' hơn là 'Tại sao lại như vậy ...'.
karim79

8
Nếu câu hỏi có thể được trả lời bằng một câu trả lời đơn giản là có hoặc không, thì người hỏi nên cân nhắc việc diễn đạt lại, sử dụng Google hoặc đơn giản là dùng thử.
Tyler Treat

3
@ karim79 Vâng, câu hỏi có thể được diễn đạt tốt hơn nhưng tôi đoán không cần nỗ lực nhiều như vậy để nhìn trước một bước.
biziclop

8

Có bạn có thể. Lớp trừu tượng được sử dụng trong java biểu thị rằng bạn không thể tạo một đối tượng của lớp. Và một phương thức trừu tượng mà các lớp con phải cung cấp một triển khai cho phương thức đó.

Vì vậy, bạn có thể dễ dàng định nghĩa một lớp trừu tượng mà không cần bất kỳ phương thức trừu tượng nào.

Đối với ví dụ:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Điều này là tốt.


6

CÓ Bạn có thể tạo lớp trừu tượng với bất kỳ phương thức trừu tượng nào, ví dụ tốt nhất về lớp trừu tượng không có phương thức trừu tượng là HttpServlet
Phương thức trừu tượng là một phương thức không có phần thân, nếu bạn đã khai báo ít nhất một phương thức vào lớp, thì lớp đó phải được khai báo là một trừu tượng bắt buộc của nó NHƯNG nếu bạn đã khai báo lớp trừu tượng thì nó không bắt buộc phải khai báo phương thức trừu tượng bên trong lớp.

Bạn không thể tạo các đối tượng của lớp trừu tượng, có nghĩa là không thể khởi tạo nó.


4

Có, bạn có thể khai báo một lớp mà bạn không thể tự khởi tạo chỉ với các phương thức đã có triển khai. Điều này sẽ hữu ích nếu bạn muốn thêm các phương thức trừu tượng trong tương lai hoặc nếu bạn không muốn lớp được khởi tạo trực tiếp ngay cả khi nó không có thuộc tính trừu tượng.


Câu hỏi không phải về các lớp trừu tượng trống rỗng, chỉ là các lớp trừu tượng không có phương thức trừu tượng. Không có lý do hợp lệ nào theo như tôi thấy để sử dụng một lớp trừu tượng hoàn toàn trống rỗng.
biziclop

1
Câu trả lời đã sửa. Sử dụng một lớp trừu tượng trống có thể hữu ích nếu bạn có lý do chính đáng để muốn thêm các phương thức trừu tượng sau đó và không phải xử lý cấu trúc lại bất kỳ lớp cha nào khác.
Gordon Gustafson,

1
Ở giữa một hệ thống phân cấp, một lớp trừu tượng hoàn toàn trống (ngoại trừ đặc tả kế thừa) có thể có ý nghĩa nếu các dẫn xuất của lớp đó sẽ có các nghĩa vụ hợp đồng khác với các nghĩa vụ hợp đồng khác của các dẫn xuất gốc.
supercat

3

vâng, chúng ta có thể khai báo một lớp trừu tượng mà không cần bất kỳ phương thức trừu tượng nào. mục đích của việc khai báo một lớp là trừu tượng không phải để khởi tạo lớp đó.

hai trường hợp vậy

1) lớp trừu tượng với các phương thức trừu tượng.

loại lớp này, chúng ta phải kế thừa một lớp từ lớp trừu tượng này và phải ghi đè các phương thức trừu tượng trong lớp của chúng ta, ví dụ: lớp GenricServlet

2) lớp trừu tượng không có phương thức trừu tượng.

loại lớp này, chúng ta phải kế thừa một lớp từ lớp trừu tượng này, ví dụ: mục đích của lớp HttpServlet là mặc dù bạn nếu bạn không triển khai logic của mình trong lớp con, bạn có thể nhận được logic cha

vui lòng kiểm tra mã nguồn HttpServlet


2

Có, chúng ta có thể có một lớp trừu tượng mà không có Phương thức trừu tượng vì cả hai đều là những khái niệm độc lập. Khai báo một lớp trừu tượng nghĩa là nó không thể được khởi tạo một mình và chỉ có thể được phân lớp. Khai báo một phương thức trừu tượng có nghĩa là Phương thức sẽ được định nghĩa trong lớp con.


Tại sao tôi không muốn rằng lớp không thể được khởi tạo? Bất kỳ lý do chính đáng, ví dụ?
karlihnos

2

Có, bạn có thể định nghĩa một lớp trừu tượng mà không cần một phương thức trừu tượng. Tuy nhiên, nếu không có phương pháp nào bên trong, bạn nên sử dụng một giao diện


4
Ý tưởng hay khi sử dụng giới hạn tối thiểu 30 ký tự.
Marc W

1
Nếu không có phương thức trừu tượng thì làm thế nào có thể sử dụng một giao diện? Giao diện có tất cả các phương thức trừu tượng theo mặc định.
Usman Rana

1

đúng, bạn có thể làm điều đó.

khai báo lớp trừu tượng nghĩa là lớp đó sẽ không được khởi tạo bởi bất kỳ lớp nào khác.

và phải có ít nhất một phương thức trừu tượng bên trong nó và ý nghĩa của việc đó bạn có thể khai báo phương thức trừu tượng trong lớp đó nếu bạn không khai báo phương thức hơn là được.

thí dụ:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

điều này chắc chắn sẽ hoạt động.


1

Có bạn có thể. Đôi khi bạn có thể được hỏi câu hỏi này rằng mục đích của việc này là gì? Câu trả lời là: đôi khi chúng ta phải hạn chế lớp khởi tạo bởi chính nó. Trong trường hợp đó, chúng tôi muốn người dùng mở rộng lớp Tóm tắt và khởi tạo lớp con


1

Bạn có thể, câu hỏi trong tâm trí của tôi là nhiều hơn bạn nên. Ngay từ đầu, tôi sẽ nói rằng không có câu trả lời nào khó và nhanh cả. Hãy làm điều đúng đắn cho hoàn cảnh hiện tại của bạn.

Đối với tôi, thừa kế ngụ ý một mối quan hệ 'là một'. Hãy tưởng tượng một lớp chó, có thể được mở rộng bởi các loại phụ chuyên biệt hơn (Alsatian, Poodle, v.v.). Trong trường hợp này, làm cho lớp con chó trở nên trừu tượng có thể là điều đúng đắn nên làm vì kiểu con là con chó. Bây giờ chúng ta hãy tưởng tượng rằng những con chó cần một vòng cổ. Trong trường hợp này, thừa kế không có ý nghĩa: thật vô nghĩa nếu có một mối quan hệ 'là một' giữa chó và vòng cổ. Đây chắc chắn là mối quan hệ 'có-phải-có', cổ áo là vật hợp tác. Làm cho cổ áo trừu tượng chỉ để chó có thể có một cái không có ý nghĩa.

Tôi thường thấy rằng các lớp trừu tượng không có phương thức trừu tượng đang thực sự thể hiện mối quan hệ 'has-a'. Trong những trường hợp này, tôi thường thấy rằng mã có thể được tính toán tốt hơn mà không cần sử dụng kế thừa. Tôi cũng thấy rằng các lớp trừu tượng không có phương thức trừu tượng thường là mùi mã và ít nhất sẽ dẫn đến các câu hỏi được nêu ra trong một bài đánh giá mã.

Một lần nữa, điều này là hoàn toàn chủ quan. Cũng có thể có những tình huống khi một lớp trừu tượng không có phương thức trừu tượng có ý nghĩa, nó hoàn toàn phụ thuộc vào việc giải thích và biện minh. Đưa ra quyết định tốt nhất cho bất cứ điều gì bạn đang làm.


1

Trên thực tế, không có nghĩa là nếu một lớp trừu tượng không có bất kỳ phương thức trừu tượng nào. Một lớp trừu tượng giống như một người cha. Người cha này có một số đặc tính và hành vi, khi bạn còn nhỏ muốn trở thành con của người cha, người cha nói rằng đứa trẻ (bạn) phải theo cách này, đó là MOTO của chúng tôi, và nếu bạn không muốn làm như vậy, bạn không phải là con tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.