Câu hỏi Sự khác nhau giữa hàm trừu tượng và hàm ảo là gì?


Sự khác nhau giữa hàm trừu tượng và hàm ảo là gì? Trong trường hợp nào được khuyến khích sử dụng ảo hoặc trừu tượng? Cách tiếp cận nào đúng hơn?


1304
2017-12-24 14:11


gốc


Một hàm trừu tượng phải được ghi đè trong khi hàm ảo có thể bị ghi đè. - Jordan Parmer
Các hàm ảo có thể có một thực thi mặc định / generic trong lớp cơ sở. - Martin
Từ khóa ở đây là trừu tượng; Chúng không tồn tại và chỉ là một ý tưởng mơ hồ về hàm này là gì (chữ ký phương thức) - Cole Johnson


Các câu trả lời:


Một hàm trừu tượng không thể có chức năng. Về cơ bản bạn nói rằng, bất kỳ lớp con nào cũng phải đưa ra phiên bản riêng của phương thức này, tuy nhiên nó quá chung chung để thậm chí cố gắng thực hiện trong lớp cha.

Một chức năng ảo, về cơ bản là nói xem, đây là chức năng có thể hoặc có thể không đủ tốt cho lớp con. Vì vậy, nếu nó là đủ tốt, sử dụng phương pháp này, nếu không, sau đó ghi đè lên tôi, và cung cấp chức năng của riêng bạn.


2325
2017-12-24 14:14



Và tất nhiên, nếu bạn ghi đè lên một phương thức ảo, bạn luôn có thể tham khảo phương thức cha mẹ bằng cách gọi base.Foo (...) - Brann
Cảm ơn. Đây là một lời giải thích tốt hơn và dễ dàng hơn nhiều so với bất cứ điều gì trong tài liệu MSDN. (Tôi đã có một nhức đầu sau năm phút đọc này: msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx) - Jake
Đến từ Java, tôi hơi bối rối vì sao chúng ta cần làm cho nó ảo cả, cho đến khi tôi đọc nó: stackoverflow.com/a/1062126/193634 - Rosdi Kasim
@MeqDotNet Nó có nghĩa là nếu bạn thích triển khai của tôi sử dụng tôi nếu không viết của riêng bạn tốt hơn so với tôi :) - Usman Y
Điều này nên được trong thư viện tham khảo của Microsoft mà tôi đã dành 10 phút đọc và vẫn còn bối rối. - SamChen


Một hàm trừu tượng không có triển khai và nó chỉ có thể được khai báo trên một lớp trừu tượng. Điều này buộc các lớp dẫn xuất để cung cấp một thực hiện. Một hàm ảo cung cấp một thực thi mặc định và nó có thể tồn tại trên một lớp trừu tượng hoặc một lớp không trừu tượng. Ví dụ:

public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}

244
2017-12-24 14:19



Rất hữu ích để xem mã mẫu - giúp làm cho các giải thích khác nhau trong các câu trả lời rõ ràng hơn nhiều. - Simon Tewsi
Tôi đã quay lại câu trả lời cho phiên bản trước: hai lớp chỉ là các ví dụ, lớp đầu tiên sẽ biên dịch vì nó được đánh dấu là trừu tượng, thứ hai sẽ không. Liệu MyBase kế thừa từ một số lớp khác hay không thì không liên quan. - Dirk
Không phải của bạn MyBase lớp học phải thực hiện trừu tượng lớp học, bằng cách nào đó? Tôi không làm điều này thường xuyên, vì vậy tôi có thể nhầm lẫn. Tôi không thấy điều đó trong ví dụ của bạn. - jp2code
Trong ví dụ trên, MyBase hiển thị những gì bạn không thể làm. Đó là bạn không thể có một phương thức trừu tượng trong một lớp không trừu tượng - JoshBerke


  1. Chỉ có abstract các lớp học có thể có abstract các thành viên.
  2. Không phảiabstract lớp kế thừa từ một abstract lớp học phải  override nó là abstract các thành viên.
  3. An abstract thành viên là hoàn toàn virtual.
  4. An abstract thành viên không thể cung cấp bất kỳ việc thực hiện nào (abstract được gọi là pure virtual bằng một số ngôn ngữ).

68
2018-04-16 09:03



Số 3 không có ý nghĩa với tôi. Tôi nghĩ rằng bạn có nghĩa là để nói "Một thành viên của một lớp trừu tượng là hoàn toàn ảo" (tức là, bạn có thể cung cấp chức năng cho nó mà không cần phải xác định rằng nó là ảo). - Hobo Spider
Không, ý tôi là chính xác những gì tôi đã viết. Một thành viên của một lớp trừu tượng có thể virtual hoặc khôngvirtual. An abstract thành viên (tức là thuộc tính trừu tượng, phương thức trừu tượng) giống như một phương thức ảo, tức là bạn có thể ghi đè lên nó, ngoại trừ việc nó không mang theo bản thân một thực thi mặc định. - Mehrdad Afshari
Trích dẫn "Tóm tắt thành viên là" ngầm "ảo". Nhưng tôi thấy ở đâu đó, ai đó đã tạo ra các thành viên trừu tượng bằng cách thêm từ khóa "ảo" một cách rõ ràng. Đó là không cần thiết và infact nó đã cho tôi một nghi ngờ cho đến khi tôi đọc câu trả lời của bạn. - bonCodigo
Xin vui lòng bao gồm các tài liệu tham khảo hỗ trợ cho điểm 4. Và bài viết của bạn không mang lại bất cứ điều gì khác mà những người trước đó đã không. - Rafael


Bạn phải luôn ghi đè lên một hàm trừu tượng.

Do đó:

  • Hàm trừu tượng - khi nào người thừa kế phải tự thực hiện
  • Ảo - khi nào tùy thuộc vào người kế thừa để quyết định

49
2017-12-24 14:13





Chức năng trừu tượng:

  1. Nó có thể được khai báo chỉ bên trong lớp trừu tượng.
  2. Nó chỉ chứa khai báo phương thức không thực hiện trong lớp trừu tượng.
  3. Nó phải được ghi đè trong lớp dẫn xuất.

Chức năng ảo:

  1. Nó có thể được khai báo bên trong trừu tượng cũng như lớp không trừu tượng.
  2. Nó chứa phương pháp thực hiện.
  3. Nó có thể bị ghi đè.

30
2018-05-28 07:52





Phương thức trừu tượng: Khi một lớp chứa một phương thức trừu tượng, lớp đó phải được khai báo là trừu tượng. Phương thức trừu tượng không có triển khai thực hiện và do đó, các lớp bắt nguồn từ lớp trừu tượng đó, phải cung cấp một triển khai thực hiện cho phương thức trừu tượng này.

Phương thức ảo: Một lớp có thể có một phương thức ảo. Phương thức ảo có triển khai thực hiện. Khi bạn kế thừa từ một lớp có phương thức ảo, bạn có thể ghi đè lên phương thức ảo và cung cấp logic bổ sung, hoặc thay thế logic bằng cách thực hiện của riêng bạn.

Thời điểm sử dụng: Trong một số trường hợp, bạn biết rằng một số loại nhất định phải có một phương pháp cụ thể, nhưng, bạn không biết triển khai phương pháp này.
Trong những trường hợp như vậy, bạn có thể tạo một giao diện chứa một phương thức có chữ ký này. Tuy nhiên, nếu bạn có trường hợp như vậy, nhưng bạn biết rằng những người triển khai giao diện đó cũng sẽ có một phương thức chung khác (mà bạn đã có thể cung cấp việc triển khai), bạn có thể tạo một lớp trừu tượng. Lớp trừu tượng này sau đó chứa phương thức trừu tượng (phải được overriden), và một phương thức khác có chứa logic 'phổ biến'.

Một phương pháp ảo nên được sử dụng nếu bạn có một lớp học có thể được sử dụng trực tiếp, nhưng mà bạn muốn thừa kế có thể thay đổi hành vi nhất định, mặc dù nó không phải là bắt buộc.


27
2018-04-16 09:03





giải thích: với sự tương tự. hy vọng nó sẽ giúp bạn.

Bối cảnh

Tôi làm việc trên tầng 21 của một tòa nhà. Và tôi hoang tưởng về lửa. Từng ngày một lần, một nơi nào đó trên thế giới, một ngọn lửa đang đốt cháy một cái cạp trên bầu trời. Nhưng may mắn là chúng tôi có hướng dẫn sử dụng ở đâu đó ở đây về những việc cần làm trong trường hợp hỏa hoạn:

FireEscape ()

  1. Không thu thập đồ đạc
  2. Đi bộ để thoát hiểm
  3. Đi ra khỏi tòa nhà

Về cơ bản, đây là một phương pháp ảo được gọi là FireEscape ()

Phương pháp ảo

Kế hoạch này khá tốt cho 99% hoàn cảnh. Đó là một kế hoạch cơ bản hoạt động. Nhưng có một cơ hội 1% rằng việc thoát hiểm bị chặn hoặc bị hư hỏng trong trường hợp bạn hoàn toàn bị bóp méo và bạn sẽ trở thành bánh mì nướng trừ khi bạn thực hiện một số hành động quyết liệt. Với các phương thức ảo, bạn có thể thực hiện điều đó: bạn có thể ghi đè lên kế hoạch FireEscape () cơ bản với phiên bản kế hoạch của riêng bạn:

  1. Chạy đến cửa sổ
  2. Nhảy ra ngoài cửa sổ
  3. Parachute an toàn xuống đáy

Nói cách khác các phương pháp ảo cung cấp một kế hoạch cơ bản, có thể được overriden nếu bạn cần. Các lớp con có thể ghi đè lên phương thức ảo của lớp cha nếu lập trình viên cho rằng nó thích hợp.

Phương pháp trừu tượng

Không phải tất cả các tổ chức đều được khoan giếng. Một số tổ chức không thực hiện các cuộc tập trận hỏa hoạn. Họ không có một chính sách thoát hoàn toàn. Mỗi người đàn ông là cho chính mình. Quản lý chỉ quan tâm đến chính sách như vậy hiện có.

Nói cách khác, mỗi người là buộc để phát triển phương thức FireEscape () của riêng mình. Một anh chàng sẽ bước ra khỏi lối thoát hiểm. Một người khác sẽ nhảy dù. Một anh chàng khác sẽ sử dụng công nghệ đẩy tên lửa để bay ra khỏi tòa nhà. Một anh chàng khác sẽ đi ra ngoài. Quản lý không quan tâm làm sao bạn trốn thoát, miễn là bạn có một kế hoạch FireEscape () cơ bản - nếu họ không bạn có thể được đảm bảo OHS sẽ đi xuống trên tổ chức như một tấn gạch. Đây là ý nghĩa của một phương pháp trừu tượng.

Sự khác biệt giữa hai lần nữa là gì?

Phương thức trừu tượng: các lớp con buộc để triển khai phương thức FireEscape của riêng họ. Với một phương pháp ảo, bạn có một kế hoạch cơ bản đang chờ bạn, nhưng có thể chọn để thực hiện của riêng bạn nếu nó không đủ tốt.

Bây giờ điều đó không quá khó?


23
2018-06-16 01:01