Hãy nói rằng Java có các lớp theo cấp bậc:Java thừa kế vs C# thừa kế
class A
{
}
class B extends A
{
public void m()
{
System.out.println("B\n");
}
}
class C extends B
{
public void m()
{
System.out.println("C\n");
}
}
class D extends C
{
public static void main(String[] args)
{
A a = new D();
// a.m(); // doesn't work
B b = new D();
b.m();
C c = new D();
c.m();
D d = new D();
d.m();
}
}
Đây là (mù) trùng lặp của cùng mã trong C#:
using System;
class A
{
}
class B : A
{
public void M()
{
Console.WriteLine("B");
}
}
class C : B
{
public void M() // I need to use public new void M() to avoid the warning
{
Console.WriteLine("C");
}
}
class D : C
{
public static void Main(String[] args)
{
A a = new D();
// a.M(); // doesn't work
B b = new D();
b.M();
C c = new D();
c.M();
D d = new D();
d.M();
}
}
Khi tôi thực hiện Java mã, tôi nhận được C-C-C
trong khi C# trả về B-C-C
.
Với tôi, kết quả của C# có ý nghĩa hơn, vì tham chiếu B gọi phương thức riêng của nó.
- Lý do đằng sau quyết định của nhà thiết kế Java là in
C-C-C
thay vìB-C-C
là gì? Tôi có nghĩa là, tại sao tham chiếu B sử dụng phương pháp ghi đè trong C? Ưu điểm của phương pháp này là gì? - Làm cách nào để thay đổi mã Java để in ra
B-C-C
giống như C#? Ý tôi là, làm thế nào tôi có thể dạy java để gọi phương thức tham chiếu chính xác mà nó sử dụng? - Tôi làm cách nào để thay đổi mã C# để in ra
C-C-C
? Tôi có nghĩa là, làm thế nào tôi có thể dạy C# để gọi phương pháp ghi đè?
Đó là một vấn đề thiết kế đơn giản - java sử dụng cử động theo mặc định, trong khi C# không, để có được năng động gửi trong C# bạn cần khai báo một phương thức ảo và chỉ ra rằng phương thức ghi đè thực sự là ghi đè nó. – amit
Các lớp D và A không có chức năng ở đây.Bạn có thể bỏ qua chúng cho một mẫu ngắn hơn (rõ ràng hơn). –