Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Hỏi về toán tử new dùng cho method (shadowing)

  1. #1
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mặc định Hỏi về toán tử new dùng cho method (shadowing)

    Mình ko hiểu về kĩ thuật shadowing này lắm. Các bạn giải thích cho mình với.

    Visual C# Code:
    1. class B : A
    2. {
    3.     public new void display()
    4.     {
    5.         Console.WriteLine("B.display");
    6.     }
    7. }
    pEnGwINUS.

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Nó là 1 trong 3 thuộc tính của OOP.
    Kĩ thuật này gọi là Hiding hoặc là Shadowing (Java )

    Giả sử có class A:
    Visual C# Code:
    1. class A { public void display() { Console.WriteLine("A.display"); } }
    và class B như của Hiếu ở trên.
    Anh tạo một code để test object như sau:
    Visual C# Code:
    1. class TestPolymorphism {
    2.        public static void Main() {
    3.              A a; B b;
    4.              a = new A(); b = new B();
    5.              
    6.              a.display(); // result: A.display
    7.              b.display(); // result: B.display
    8.              
    9.              a = new B();
    10.              a.display(); // result: A.display
    11.        }
    12. }

    ở đây A là lớp Parent, B là Child. Nếu một A instance tham chiếu vào một object của child thì method tương ứng sẽ bị Hidden (tạm gọi là: Che mặt)
    Ở Java, không cần đến từ khóa new, nó sẽ tự khắc hiểu là SHADOW
    Tránh hiểu lầm với Overriding là thiết lập đè hoàn toàn; tức là
    Visual C# Code:
    1. a = new B();
    2. a.display(); // result: B.display chứ không phải là A.display
    None!

  3. #3
    Ngày gia nhập
    09 2006
    Bài viết
    18

    Nói chung từ khóa new với chức năng làm bổ từ không có cũng hem sao , bác không thêm nó vô hàm thì nó đưa cảnh báo ra thui , chứ chương trình dịch thì vẫn ra kết quả như khi ta thêm vào (chức năng thừa của từ khóa new).

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi tandaica0612 Xem bài viết
    Nói chung từ khóa new với chức năng làm bổ từ không có cũng hem sao , bác không thêm nó vô hàm thì nó đưa cảnh báo ra thui , chứ chương trình dịch thì vẫn ra kết quả như khi ta thêm vào (chức năng thừa của từ khóa new).
    "CHỨC NĂNG THỪA" <==== một câu trả lời thật là VÃI LÚA.

    new modifier

    Code:
    http://msdn.microsoft.com/en-us/library/51y09td4(VS.71).aspx#vclrfnew_newmodifier
    None!

  5. #5
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    a = new B();
    a.display(); // result: B.display chứ không phải là A.display
    Cái này chỉ đối với phương thức, còn với thuộc tính thì không cho phép.
    Vì một điều quan trọng của OOP là thuộc tính được bảo mật hàng đầu.
    Tưởng tượng giống quả bóng hai lớp, lớp ngoài là phương thức, lớp trong ( kernel ) là thuộc tính. Khi đó phương thức sử lý thuộc tính mà Actor không được phép sử lý thuộc tính.
    Cái này trước mình có test một lần. Để mình kiểm tra lại chút xíu.
    À X này, cái này hình như chỉ cho phép với lớp abstract hay sao ấy nhỉ. Lâu không động đến nên mang máng quá.
    Đã được chỉnh sửa lần cuối bởi NT_OnlyLove : 27-10-2008 lúc 10:20 PM. Lý do: Nhầm giữa thuộc tính và phương thức
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  6. #6
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mặc định Hỏi về toán tử new dùng cho method (shadowing)

    Cảm ơn anh X đã chỉ bảo.

    Nhưng:
    "CHỨC NĂNG THỪA" <==== một câu trả lời thật là VÃI LÚA.
    Em cũng thấy thực ra có new hay ko có new cũng cho kết quả như nhau (thậm chí Java ko cần dùng new, còn C# cũng chỉ warning là nên thêm vào cho nó explicit). Có đúng như vậy ko ạ?
    pEnGwINUS.

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    18

    Trích dẫn Nguyên bản được gửi bởi Xcross87 Xem bài viết
    "CHỨC NĂNG THỪA" <==== một câu trả lời thật là VÃI LÚA.

    new modifier

    Code:
    http://msdn.microsoft.com/en-us/library/51y09td4(VS.71).aspx#vclrfnew_newmodifier
    Bạn biết sự khác nhau thực tế giữa không dùng nó và có nó thế nào , cho mình xin một example được hem , còn mình thì theo thực nghiệm và tìm kiếm trên mạng và đọc trong msdn thì hem thấy có ví dụ nào về sự khác biệt gì ngoài 1 warning giữa không có nó và có nó cả

  8. #8
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi tandaica0612 Xem bài viết
    Bạn biết sự khác nhau thực tế giữa không dùng nó và có nó thế nào , cho mình xin một example được hem , còn mình thì theo thực nghiệm và tìm kiếm trên mạng và đọc trong msdn thì hem thấy có ví dụ nào về sự khác biệt gì ngoài 1 warning giữa không có nó và có nó cả
    Trả lời cho cậu nha.

    1. Ai bảo là không có sự khác biệt => dịch ngược code la IL rồi so sánh
    2. Có ít nhất 1 điểm khác biệt => new đánh giá là non-virtual. MS đặt ra cái warning chỉ để thông báo người dùng biết.
    3. Ban đầu khi C# được thiết kế (bản C# beta ), chưa có từ khóa new, nhưng do xích mích mâu thuẫn với Sun nên phải tạo ra cái này để tránh vụ luật sở hữu trí tuệ.
    4. Vì Java với design OOP trước C# nên người dùng sử dụng C# không biết hoặc không quan tâm đến new (vì chả quan trọng), và design theo hướng Java nhưng trên code C# => ước tính đến 85%
    5. Với những nhóm phân tích và thiết kế, từ khóa new được dùng với 2 mục đích chính:
    a. Hoàn thiện mô hình OOP chuẩn của MS
    b. Hỗ trợ debug <---- class thừa kế đa hình (tạm gọi thế vì không biết tiếng việt từ này)
    6. Tại sao google không có vấn đề này ??? [Câu hỏi hay ]
    - thì đã là warning thì chả có gì quan trọng, đa số người dùng code thấy chạy được là OK rồi, hỏi làm gì cho mệt ra.

    7. Một điều thú vị:
    virtual => để override method
    new (hoặc không cần) => để hiding method
    => thế chạy: virtual new => ra cái gì ===> Mời các bạn tự nghiên cứu ! [Tự mò tự tìm hiểu mới thấy cái hay ]

    8. CHÚ Ý NHA:
    - Không có sự thiết kế, sáng tạo nào gọi là THỪA, chỉ người có người sử dụng cái đó là THIẾU hiểu biết về nó thôi

    Mà đã lỡ có rồi thì dùng cho nó hoàn thiện , làm ví dụ chơi giải trí:
    Visual C# Code:
    1.     public static int ___x = 0;
    2. }
    3.  
    4. public class B : A {
    5.     new public static int ___x = 1;
    6.  
    7.     static void Main() {
    8.         // KQ: 1
    9.         Console.WriteLine(___x);
    10.         // KQ: 0
    11.         Console.WriteLine(A.___x);
    12.     }
    13. }
    None!

  9. #9
    Ngày gia nhập
    09 2006
    Bài viết
    18

    thank , lại thêm được một kiến thức , lại thấy hem biết gì về dịch ngược , lại tìm hiểu vậy

Các đề tài tương tự

  1. Upload file dùng Ajax mà ko dùng Method Post của Form như thế nào?
    Gửi bởi hieupxd2cntt trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 8
    Bài viết cuối: 14-09-2014, 10:23 PM
  2. Lập trình C++0x [POINTER] int * method... ý nghĩa và cách dùng
    Gửi bởi quano1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 26-08-2013, 10:17 AM
  3. Dùng jquery để gọi 1 Action Method bằng cách nào trong mvc 3
    Gửi bởi danchithancong trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 6
    Bài viết cuối: 20-08-2012, 11:32 PM
  4. Instance method và class method khác nhau như thế nào?
    Gửi bởi zenstorm trong diễn đàn Thắc mắc lập trình Objective-C
    Trả lời: 4
    Bài viết cuối: 24-02-2012, 09:36 AM
  5. Lập trình C++ Nên định nghĩa các method trong thân class hay định bên ngoài (dùng ::)
    Gửi bởi longtth trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 12-07-2011, 06:43 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn