2011-08-25 35 views
5

1) Tại sao các mã sau đây khác nhau.Tại sao Java và C# khác nhau trong oops?

C#:

class Base 
{ 
    public void foo() 
    { 
    System.Console.WriteLine("base"); 
    } 
} 

class Derived : Base 
{ 
    static void Main(string[] args) 
    { 
    Base b = new Base(); 
    b.foo(); 
    b = new Derived(); 
    b.foo(); 
    } 
    public new void foo() 
    { 
    System.Console.WriteLine("derived"); 
    } 
} 

Java:

class Base { 
    public void foo() { 
    System.out.println("Base"); 
    } 
} 

class Derived extends Base { 
    public void foo() { 
    System.out.println("Derived"); 
    } 

    public static void main(String []s) { 
    Base b = new Base(); 
    b.foo(); 
    b = new Derived(); 
    b.foo(); 
    } 
} 

2) Khi chuyển từ một ngôn ngữ khác gì là những điều chúng ta cần phải đảm bảo cho quá trình chuyển đổi trơn tru.

+5

chính xác là gì câu hỏi của bạn? Mã này khác nhau vì nó không phải là cùng một ngôn ngữ. Câu trả lời này có đủ không? – RoflcoptrException

+0

Câu hỏi này khác với bài tập về nhà như thế nào? – Filburt

+0

@Filburt: Xem câu trả lời. Đó không phải là câu hỏi về bài tập về nhà –

Trả lời

9

Lý do là trong Java, các phương thức là virtual theo mặc định. Trong C#, các phương thức ảo phải được đánh dấu rõ ràng như vậy.
Mã # C sau đây là tương đương với mã Java - lưu ý việc sử dụng virtual trong lớp cơ sở và override trong lớp có nguồn gốc:

class Base 
{ 
    public virtual void foo() 
    { 
     System.Console.WriteLine("base"); 
    } 
} 

class Derived 
    : Base 
{ 
    static void Main(string[] args) 
    { 
     Base b = new Base(); 
     b.foo(); 
     b = new Derived(); 
     b.foo(); 

    } 

    public override void foo() 
    { 
     System.Console.WriteLine("derived"); 
    } 
} 

Mã C# bạn được đăng ẩn phương pháp foo trong lớp Derived. Đây là một cái gì đó bạn thường không muốn làm, bởi vì nó sẽ gây ra vấn đề với thừa kế.

Sử dụng lớp bạn đăng, đoạn mã sau sẽ ra những điều khác nhau, mặc dù nó luôn luôn cùng một ví dụ:

Base b = new Derived(); 
b.foo(); // writes "base" 
((Derived)b).foo(); // writes "derived" 

Mã cố định tôi cung cấp ở trên sẽ đưa ra "nguồn gốc" trong cả hai trường hợp.

7

Mã C# sẽ biên dịch với cảnh báo vì bạn đang ẩn các phương thức tại đó.

Trong Java, các phương thức lớp luôn ảo, trong khi trong C# chúng không có, và bạn phải đánh dấu chúng một cách rõ ràng là 'ảo'.

Trong C#, bạn sẽ phải làm điều này:

public class Base 
{ 
    public virtual void Foo() 
    { 
     Console.WriteLine ("Base"); 
    } 
} 

public class Derived : Base 
{ 
    public override void Foo() 
    { 
     Console.WriteLine ("Derived."); 
    } 
} 
Các vấn đề liên quan