PDA

View Full Version : Sự khác biệt giữa new, virtual và override ?



NT_OnlyLove
24-02-2008, 02:14 PM
Mình đọc đến đây thì thấy:


1.Hai cấu trúc này là như nhau
2.new cú pháp ngắn gọn hơn
3.Tuy nhiên mỗi cái có cách hiểu riêng:


3.1 new : Ý nghĩa tạo một phiên bản mới
3.2 virtual && override: Ý nghĩa phủ quyết( rõ ràng hơn)

4.Nhưng dùng new thì hay hơn cả ( tránh được khi lớp base có thay đổi lại phương thức ).

Những nhận xét đó đúng và sai ở đâu? Vui lòng chỉ giúp và bổ xung hộ.
Thanks!

Solokop
24-02-2008, 04:31 PM
Cái này liên quan đến tính đa hình (Polymorphism)

1. Nếu xài override :


// Base Class
class BaseClass {
public virtual void DoSomeThing() {
Console.WriteLine("I'm solokop");
}
}

// Derived Class
class DerivedClass : BaseClass {
public override void DoSomeThing() {
Console.WriteLine("I'm koploso");
}
}

// Test Driver
public static void Main() {
BaseClass b = new DerivedClass();
DerivedClass d = new DerivedClass();
b.DoSomeThing();
d.DoSomeThing();
}

// Result
I'm koploso
I'm koploso


2. Nếu xài new :


// Base Class
class BaseClass {
public virtual void DoSomeThing() {
Console.WriteLine("I'm solokop");
}
}

// Derived Class
class DerivedClass : BaseClass {
public new void DoSomeThing() {
Console.WriteLine("I'm koploso");
}
}

// Test Driver
public static void Main() {
BaseClass b = new DerivedClass();
DerivedClass d = new DerivedClass();
b.DoSomeThing();
d.DoSomeThing();
}

// Result
I'm solokop
I'm koploso

Có gì chưa hiểu cứ hỏi nhc1990 nha (Y:DY)

NT_OnlyLove
24-02-2008, 06:00 PM
Dù sao cũng cảm ơn solokop 0:) .
Tuy nhiên tôi chỉ hỏi những nhận xét của tôi có đúng không? và mong được bổ xung chứ không có ý là hỏi về cấu trúc phải viết như thế nào.

@nhc2000: Cho hỏi chút, cái abstract:
1.Nếu muốn phương thức là abstract thì lớp trước tiên phải là abstract?
Tôi test và nhận thấy như vậy.
À cậu có tài liệu về form không up lên cho mọi người với.Tôi đang đọc cái C# Professional Projects mà hình nó mờ quá , mỏi hết cả mắt luôn.

Solokop
24-02-2008, 06:54 PM
@ NT_OnlyLOve : Thì cậu đọc code trên tất nhiên sẽ tự biết là nhận xét của mình có đúng hay không (Chứ code trên đâu có dạy cậu cách viết cấu trúc hay cú pháp gì đâu).

New : Tạo một phiên bản mới cho một method không ràng buộc với phiên bản cũ ở lớp cha (hay nói cách khác nó tự ẩn cái method cũ đi)

Override : Ghi đè lên thằng cũ, chú ý là thằng cũ vẫn tồn tại song song với thằng mới. Tùy vào kiểu của lớp (đối tượng) được khai báo sẽ có phương thức phù hợp được gọi.

P/S : Mấy cái code trên chưa test đâu nha T_T. Còn vụ ebook thì cứ hỏi nhc2005 đó, hắn có nhiều sách lắm

NT_OnlyLove
25-02-2008, 10:05 AM
@ NT_OnlyLOve : Thì cậu đọc code trên tất nhiên sẽ tự biết là nhận xét của mình có đúng hay không (Chứ code trên đâu có dạy cậu cách viết cấu trúc hay cú pháp gì đâu).

P/S : Mấy cái code trên chưa test đâu nha T_T. Còn vụ ebook thì cứ hỏi nhc2005 đó, hắn có nhiều sách lắm

Ừm cảm ơn Solokop nhiều, nhưng cái mình hiểu đều đúng sau khi code.

Mọi người cho hỏi chút về sealed:
Trong ebook nói sealed class không cho khai báo protected , vậy mà mình khai báo vẫn được. Mình thử đi thử lại mà vẫn không có vấn đề gì.(:-)w
Vậy mọi người code hộ mình đoạn nó không cho phép nhé.
Thanks.

dieucay555
05-03-2008, 07:05 PM
Mình đọc đến đây thì thấy:

Những nhận xét đó đúng và sai ở đâu? Vui lòng chỉ giúp và bổ xung hộ.
Thanks!
Hình như cái này liên quan đến cả cấp kế thừa,new là dùng trong trường hợp kế thừa trực tiếp,còn cái kia là dùng trong kế thừa đa cấp thì phải(đọc được ở đâu đó(:-)? )

start_89
03-09-2009, 10:48 PM
Các đại ca cho em hỏi thêm với:
Thế có new và không có new khác nhau gì vậy(hình như trong c++ không phân ra hai trường hợp như thế này).
Sao em bỏ new đi thì kết quả vẫn giống có new vậy