2013-02-06 67 views
57

Dưới đây là một số mã từ MSDN:khác biệt giữa các phương pháp ảo và trừu tượng

// compile with: /target:library 
public class D 
{ 
    public virtual void DoWork(int i) 
    { 
     // Original implementation. 
    } 
} 

public abstract class E : D 
{ 
    public abstract override void DoWork(int i); 
} 

public class F : E 
{ 
    public override void DoWork(int i) 
    { 
     // New implementation. 
    } 
} 

bất cứ ai có thể giải thích các mã trên liên quan đến sự khác biệt giữa các phương pháp trừu tượng và ảo với?

+0

câu hỏi cụ thể của bạn là gì, những gì bạn không hiểu? –

+0

Mọi thứ bạn đã sao chép từ http://msdn.microsoft.com/en-us/library/ms173150(v=vs.80).aspx – andy

+0

@DanielHilgarth đã cập nhật câu hỏi của tôi.Vui lòng xem. – iJade

Trả lời

150

Phương pháp ảo có triển khai và cung cấp các lớp dẫn xuất có tùy chọn ghi đè nó. Các phương thức trừu tượng không cung cấp sự triển khai thực hiện và buộc các lớp dẫn xuất ghi đè lên phương thức.

Vì vậy, các phương thức trừu tượng không có mã thực tế trong chúng và các lớp con CÓ PHẢI ghi đè phương thức. Các phương thức ảo có thể có mã, thường là một thực thi mặc định của một cái gì đó, và bất kỳ lớp con nào có thể ghi đè lên phương thức bằng cách sử dụng công cụ sửa đổi override và cung cấp triển khai tùy chỉnh.

public abstract class E 
{ 
    public abstract void AbstractMethod(int i); 

    public virtual void VirtualMethod(int i) 
    { 
     // Default implementation which can be overridden by subclasses. 
    } 
} 

public class D : E 
{ 
    public override void AbstractMethod(int i) 
    { 
     // You HAVE to override this method 
    } 
    public override void VirtualMethod(int i) 
    { 
     // You are allowed to override this method. 
    } 
} 
+4

Xuất sắc! Một câu hỏi mặc dù ... Bạn có phải nêu rõ 'override' cho phương thức trừu tượng trong lớp con [vì nó được yêu cầu nó được ghi đè] không? –

+7

Đối với các phương pháp trừu tượng, bạn phải giải thích rõ ràng, vâng. Đối với các phương pháp ảo, nó phức tạp hơn. Nếu bạn không nói từ khóa 'override' ở đó, phương thức gốc sẽ bị ẩn. Nếu đây là ý định của bạn, bạn có thể sử dụng từ khóa 'mới' để loại bỏ cảnh báo, nhưng trường hợp bạn muốn ẩn các phương thức là khá hiếm. Vì vậy, trừ khi bạn đặc biệt muốn sử dụng phương thức ẩn, bạn nên luôn sử dụng từ khóa 'override' – Dennisch

35

Trước hết bạn nên biết sự khác biệt giữa phương pháp ảo và trừu tượng.

Tóm tắt Phương pháp

  • Tóm tắt Phương pháp nằm trong lớp trừu tượng và nó không có cơ thể.
  • Phương thức trừu tượng phải được ghi đè trong lớp con không trừu tượng.

ảo Phương pháp

  • Phương pháp ảo có thể cư trú trong lớp trừu tượng và phi trừu tượng.
  • Không nhất thiết phải ghi đè lên phương thức ảo có nguồn gốc nhưng có thể.
  • phương pháp ảo phải có cơ thể .... có thể được ghi đè bởi "từ khóa override" .....
+0

* Abstract Method phải được ghi đè trong lớp con không trừu tượng. * Không giống như vậy, bạn cũng có thể ghi đè lên nó trong một lớp trừu tượng. –

3

một phương pháp trừu tượng phải ghi đè lên cuộc gọi trong lớp có nguồn gốc khác lỗi khôn ngoan nó sẽ cho thời gian biên dịch và trong ảo bạn có thể hoặc không thể ghi đè lên nó phụ thuộc nếu nó đủ tốt sử dụng nó

Ví dụ:

abstract class twodshape 
{ 
    public abstract void area(); // no body in base class 
} 

class twodshape2 : twodshape 
{ 
    public virtual double area() 
    { 
     Console.WriteLine("AREA() may be or may not be override"); 
    } 
} 
2

Tóm tắt Phương pháp:

01.
  • Nếu phương pháp trừu tượng được xác định trong một lớp, thì lớp học phải là khai báo là lớp trừu tượng.

  • Phương pháp trừu tượng chỉ nên chứa định nghĩa phương thức, không được Chứa nội dung/triển khai phương pháp.

  • Phương pháp trừu tượng phải vượt quá mức trong lớp dẫn xuất.

Phương pháp ảo:

  • phương pháp ảo có thể được hơn đi xe trong lớp được thừa kế nhưng không bắt buộc.
  • Phương pháp ảo phải có phần thân/triển khai phương pháp dọc theo với định nghĩa.

Ví dụ:

public abstract class baseclass 
     { 
      public abstract decimal getarea(decimal Radius); 

      public virtual decimal interestpermonth(decimal amount) 

      { 
       return amount*12/100; 
      } 
      public virtual decimal totalamount(decimal Amount,decimal principleAmount) 
      { 
       return Amount + principleAmount; 
      } 
     } 

     public class derivedclass:baseclass 
     { 
      public override decimal getarea(decimal Radius) 
      { 
       return 2 * (22/7) * Radius; 
      } 
      public override decimal interestpermonth(decimal amount) 
      { 
       return amount * 14/100; 
      } 

     } 
Các vấn đề liên quan