Đây là những ngôn ngữ rất khác nhau, đặc biệt là trong lĩnh vực này. Giả sử bạn có một lớp học. Trong trường hợp này, chúng tôi sẽ biến nó thành điều khiển người dùng, giống như hộp văn bản. Gọi nó là UIControl. Bây giờ chúng tôi muốn đặt điều này trong một lớp khác. Trong trường hợp này, vì chúng tôi đang sử dụng UI cho ví dụ của mình, chúng tôi sẽ gọi nó là lớp CleverPanel. Ví dụ CleverPanel của chúng tôi sẽ muốn biết về những điều xảy ra với cá thể UIControl của nó vì nhiều lý do. làm như thế nào?
Trong C #, cách tiếp cận cơ bản là kiểm tra các Sự kiện khác nhau, thiết lập các phương thức sẽ thực thi khi mỗi sự kiện thú vị được kích hoạt. Trong Java, thiếu các sự kiện, giải pháp thông thường là chuyển một đối tượng với các phương thức xử lý "sự kiện" khác nhau sang phương thức UIControl:
boolean stillNeedIt = ... ;
uiControl.whenSomethingHappens( new DoSomething() {
public void resized( Rectangle r ) { ... }
public boolean canICloseNow() { return !stillNeedIt; }
public void closed() { ... }
...
} );
Cho đến nay, sự khác biệt giữa C # và Java không sâu sắc. Tuy nhiên, chúng tôi có giao diện DoS Something không cần thiết trong C #. Ngoài ra, giao diện này có thể bao gồm rất nhiều phương thức không cần thiết hầu hết thời gian. Trong C #, chúng tôi không xử lý Sự kiện đó. Trong Java, chúng tôi tạo một lớp cung cấp một triển khai null cho tất cả các phương thức giao diện, DoS SomethingAd CHƯƠNG. Bây giờ chúng tôi thay thế DoS Something bằng DoS SomethingAdOG và chúng tôi không cần phải viết bất kỳ phương thức nào để biên dịch sạch. Chúng tôi cuối cùng chỉ ghi đè các phương thức chúng tôi cần để làm cho chương trình hoạt động đúng. Vì vậy, cuối cùng chúng ta cần một giao diện và sử dụng tính kế thừa trong Java để khớp với những gì chúng ta đã làm với các sự kiện trong C #.
Đây là một ví dụ, không phải là một cuộc thảo luận toàn diện, nhưng nó đưa ra những điều cơ bản về lý do tại sao có quá nhiều sự kế thừa trong Java trái ngược với C #.
Bây giờ, tại sao Java hoạt động theo cách này? Mềm dẻo. Đối tượng được chuyển đến khi nào đó SomethingHappens có thể đã được chuyển đến CleverPanel từ một nơi khác hoàn toàn. Nó có thể là một cái gì đó mà một số trường hợp của CleverPanel nên chuyển đến các đối tượng giống như UIControl của họ để hỗ trợ một đối tượng CleverWindow ở đâu đó. Hoặc UIControl có thể trao nó cho một trong các thành phần của nó .
Ngoài ra, thay vì bộ điều hợp, có thể có một triển khai DoS Something ở đâu đó có hàng ngàn dòng mã phía sau nó. Chúng ta có thể tạo một ví dụ mới về điều đó và vượt qua nó. Chúng ta có thể cần ghi đè một phương thức. Một mẹo phổ biến trong Java là có một lớp lớn với một phương thức như:
public class BigClass implements DoSomething {
...many long methods...
protected int getDiameter() { return 5; }
}
Sau đó, trong CleverlPanel:
uiControl.whenSomethingHappens( new BigClass() {
@Override
public int getDiameter() { return UIPanel.currentDiameter; }
} );
Nền tảng Java nguồn mở thực hiện rất nhiều điều này, điều này có xu hướng thúc đẩy các lập trình viên làm nhiều hơn - cả hai vì họ làm theo nó như một ví dụ và chỉ đơn giản là để sử dụng nó. Tôi nghĩ rằng thiết kế cơ bản của ngôn ngữ đứng sau thiết kế khung của Sun và đằng sau việc lập trình viên Java sử dụng các kỹ thuật khi không sử dụng khung.
Thật dễ dàng để tạo một lớp nhanh chóng trong Java. Lớp, ẩn danh hoặc được đặt tên, chỉ cần được tham chiếu trong một khối mã nhỏ được chôn sâu trong một phương thức. Nó có thể được tạo hoàn toàn mới hoặc bằng cách sửa đổi một chút cho một lớp rất lớn, hiện có. (Và lớp hiện tại có thể là cấp cao nhất trong tệp riêng của nó hoặc được lồng trong một lớp cấp cao nhất hoặc chỉ được xác định trong một khối mã duy nhất). Thể hiện lớp mới có thể có toàn quyền truy cập vào tất cả dữ liệu của đối tượng tạo. Và thể hiện mới có thể được thông qua và sử dụng trên toàn bộ chương trình, đại diện cho đối tượng đã tạo ra nó.
(Bên cạnh đó, lưu ý rằng việc sử dụng kế thừa lớn ở đây - như ở những nơi khác trong Java - chỉ đơn giản là cho mục đích DRY. Nó cho phép các lớp khác nhau sử dụng lại cùng một mã. )
Một lần nữa, đây không phải là một cuộc thảo luận toàn diện; Tôi chỉ đang gãi bề mặt ở đây. Nhưng vâng, có một sự khác biệt đáng ngạc nhiên về cách sử dụng tính kế thừa giữa Java và C #. Về mặt này, chúng là những ngôn ngữ rất khác nhau. Đó không phải là trí tưởng tượng của bạn.