Pertanyaan Apa perbedaan antara fungsi abstrak dan fungsi virtual?


Apa perbedaan antara fungsi abstrak dan fungsi virtual? Dalam hal mana disarankan untuk menggunakan virtual atau abstrak? Pendekatan mana yang lebih tepat?


1304
2017-12-24 14:11


asal


Jawaban:


Fungsi abstrak tidak dapat memiliki fungsi. Pada dasarnya Anda mengatakan, setiap kelas anak HARUS memberikan versi mereka sendiri dari metode ini, namun itu terlalu umum untuk mencoba menerapkan di kelas induk.

Sebuah fungsi virtual, pada dasarnya mengatakan lihat, inilah fungsi yang mungkin atau mungkin tidak cukup baik untuk kelas anak. Jadi jika itu cukup baik, gunakan metode ini, jika tidak, lalu timpa saya, dan berikan fungsi Anda sendiri.


2325
2017-12-24 14:14



Fungsi abstrak tidak memiliki implementasi dan hanya dapat dideklarasikan pada kelas abstrak. Ini memaksa kelas turunan untuk menyediakan implementasi. Sebuah fungsi virtual menyediakan implementasi default dan itu bisa ada baik di kelas abstrak atau kelas non-abstrak. Jadi misalnya:

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



  1. Hanya abstract kelas dapat memiliki abstract anggota.
  2. A non-abstract kelas yang mewarisi dari abstract kelas harus  override -nya abstract anggota.
  3. Sebuah abstract anggota secara implisit virtual.
  4. Sebuah abstract anggota tidak dapat memberikan implementasi apa pun (abstract disebut pure virtual dalam beberapa bahasa).

68
2018-04-16 09:03



Anda harus selalu mengesampingkan fungsi abstrak.

Demikian:

  • Fungsi abstrak - kapan pewaris harus menyediakan implementasinya sendiri
  • Virtual - kapan terserah kepada pewaris untuk memutuskan

49
2017-12-24 14:13



Fungsi Abstrak:

  1. Itu dapat dideklarasikan hanya di dalam kelas abstrak.
  2. Itu hanya mengandung deklarasi metode bukan implementasi dalam kelas abstrak.
  3. Itu harus ditimpa di kelas turunan.

Fungsi Virtual:

  1. Ini dapat dideklarasikan di dalam kelas abstrak maupun non abstrak.
  2. Ini berisi implementasi metode.
  3. Itu mungkin ditimpa.

30
2018-05-28 07:52



Metode abstrak: Ketika sebuah kelas berisi metode abstrak, kelas itu harus dinyatakan sebagai abstrak. Metode abstrak tidak memiliki implementasi dan dengan demikian, kelas yang berasal dari kelas abstrak itu, harus memberikan implementasi untuk metode abstrak ini.

Metode virtual: Kelas dapat memiliki metode virtual. Metode virtual memiliki implementasi. Ketika Anda mewarisi dari kelas yang memiliki metode virtual, Anda bisa mengganti metode virtual dan memberikan logika tambahan, atau ganti logika dengan implementasi Anda sendiri.

Kapan menggunakan apa: Dalam beberapa kasus, Anda tahu bahwa jenis tertentu harus memiliki metode tertentu, tetapi Anda tidak tahu apa implementasi metode ini.
Dalam kasus seperti itu, Anda dapat membuat antarmuka yang berisi metode dengan tanda tangan ini. Namun, jika Anda memiliki kasus seperti itu, tetapi Anda tahu bahwa pelaksana antarmuka itu juga akan memiliki metode umum lainnya (yang Anda sudah dapat memberikan implementasi), Anda dapat membuat kelas abstrak. Kelas abstrak ini kemudian berisi metode abstrak (yang harus ditimpa), dan metode lain yang berisi logika 'umum'.

Metode virtual harus digunakan jika Anda memiliki kelas yang dapat digunakan secara langsung, tetapi yang Anda inginkan pewaris dapat mengubah perilaku tertentu, meskipun itu tidak wajib.


27
2018-04-16 09:03



penjelasan: dengan analogi. semoga itu akan membantu Anda.

Konteks

Saya bekerja di lantai 21 gedung. Dan saya paranoid tentang api. Setiap sekarang dan lagi, di suatu tempat di dunia, api membakar pengikis langit. Tapi untungnya kami memiliki instruksi manual di suatu tempat di sini tentang apa yang harus dilakukan jika terjadi kebakaran:

FireEscape ()

  1. Jangan mengumpulkan barang-barang
  2. Berjalan ke tangga darurat
  3. Berjalan keluar dari gedung

Ini pada dasarnya adalah metode virtual yang disebut FireEscape ()

Metode Virtual

Rencana ini cukup bagus untuk 99% keadaan. Ini adalah rencana dasar yang berhasil. Tapi ada kemungkinan 1% bahwa pelarian api diblokir atau rusak, dalam hal ini Anda benar-benar kacau dan Anda akan menjadi roti panggang kecuali Anda mengambil tindakan drastis. Dengan metode virtual Anda dapat melakukan hal itu: Anda dapat mengesampingkan rencana dasar FireEscape () dengan versi rencana Anda sendiri:

  1. Lari ke jendela
  2. Lompat ke luar jendela
  3. Parasut dengan aman ke bawah

Dengan kata lain metode virtual menyediakan rencana dasar, yang dapat ditimpa jika Anda perlu. Subclass dapat menggantikan metode virtual kelas induk jika programmer menganggapnya tepat.

Metode abstrak

Tidak semua organisasi dibor dengan baik. Beberapa organisasi tidak melakukan latihan pemadaman api. Mereka tidak memiliki kebijakan melarikan diri secara keseluruhan. Setiap orang adalah untuk dirinya sendiri. Manajemen hanya tertarik pada kebijakan yang ada.

Dengan kata lain, setiap orang terpaksa untuk mengembangkan metode FireEscape () sendiri. Satu orang akan keluar dari tangga darurat. Pria lain akan parasut. Pria lain akan menggunakan teknologi pendorong roket untuk terbang menjauh dari gedung. Pria lain akan turun. Manajemen tidak peduli bagaimana Anda melarikan diri, selama Anda memiliki rencana dasar FireEscape () - jika tidak, Anda dapat dijamin OHS akan turun pada organisasi seperti satu ton batu bata. Inilah yang dimaksud dengan metode abstrak.

Apa perbedaan antara keduanya lagi?

Metode abstrak: sub-kelas adalah terpaksa untuk menerapkan metode FireEscape mereka sendiri. Dengan metode virtual, Anda memiliki rencana dasar yang menunggu Anda, tetapi dapat memilih untuk mengimplementasikan sendiri jika itu tidak cukup baik.

Sekarang itu tidak terlalu sulit kan?


23
2018-06-16 01:01



Metode abstrak adalah metode yang harus diterapkan untuk membuat kelas beton. Deklarasi berada di kelas abstrak (dan kelas apa pun dengan metode abstrak harus kelas abstrak) dan itu harus dilaksanakan dalam kelas konkrit.

Metode virtual adalah metode yang dapat ditimpa di kelas turunan menggunakan override, mengganti perilaku di superclass. Jika Anda tidak menimpa, Anda mendapatkan perilaku asli. Jika Anda melakukannya, Anda selalu mendapatkan perilaku baru. Ini bertentangan dengan metode tidak virtual, yang tidak dapat ditimpa tetapi dapat menyembunyikan metode asli. Ini dilakukan dengan menggunakan newpengubah.

Lihat contoh berikut:

public class BaseClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }


    public virtual void SayGoodbye()
    {
        Console.WriteLine("Goodbye");
    }

    public void HelloGoodbye()
    {
        this.SayHello();
        this.SayGoodbye();
    }
}


public class DerivedClass : BaseClass
{
    public new void SayHello()
    {
        Console.WriteLine("Hi There");
    }


    public override void SayGoodbye()
    {
        Console.WriteLine("See you later");
    }
}

Ketika saya memberi contoh DerivedClass dan telepon SayHello, atau SayGoodbye, Saya mendapatkan "Hi There" dan "See you later". Jika saya menelepon HelloGoodbye, Saya mendapatkan "Halo" dan "Sampai jumpa nanti". Hal ini karena SayGoodbye adalah virtual, dan dapat digantikan oleh kelas turunan. SayHello hanya tersembunyi, jadi ketika saya memanggilnya dari kelas dasar saya, saya mendapatkan metode asli saya.

Metode abstrak secara implisit virtual. Mereka mendefinisikan perilaku yang harus ada, lebih seperti antarmuka.


21
2018-04-16 09:13



Metode abstrak selalu virtual. Mereka tidak bisa memiliki implementasi.

Itulah perbedaan utamanya.

Pada dasarnya, Anda akan menggunakan metode virtual jika Anda memiliki implementasi 'default' dan ingin membiarkan keturunan mengubah perilakunya.

Dengan metode abstrak, Anda memaksa keturunan untuk menyediakan implementasi.


9
2018-04-16 09:00