Soyut funksiya ilə virtual funksiya arasındakı fərq nədir?

Virtual və ya mücərrəddən istifadə etmək üçün nə vaxt tövsiyə olunur? Doğru yanaşma nədir?

1153
24 дек. Moran dekabrın 24- nə təyin olundu 2008-12-24 17:11 '08 at 17:11 2008-12-24 17:11
@ 20 cavab

Münasib funksiya funksionallıqa malik ola bilməz. . Siz əsasən hər hansı bir uşaq sinifinin bu metodun öz versiyasını verməsi lazım olduğunu söyləyirsiniz, ancaq üst sinifdə tətbiq etməyə çalışmaq çox ümumidir.

Virtual bir funksiya əsasən bir nəzərdan danışır, burada bir uşaq sinifi üçün yaxşı ola biləcək və ya olmaya biləcək funksiyalar vardır. Buna görə də, əgər kifayət qədər yaxşı olsa, bu üsuldan istifadə edin, yoxsa sonra yenidən təyin edin və öz funksiyalarınızı təmin edin.

2103
24 дек. Cavab BFree 24 dekabrda verilir. 2008-12-24 17:14 '08 saat 05:14 'da 2008-12-24 17:14

Xülasə funksiyası heç bir həyata keçirilməmişdir və yalnız mücərrəd sinifdə elan edilə bilər. Bu, törəmə bir sinfi bir tətbiq təmin etməsinə səbəb olur. Virtual bir funksiya default tətbiq təmin edir və ya bir abstrakt sinifdə və ya qeyri-mücərrəd sinifdə mövcud ola bilər. Məsələn:

border=0
 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(); } 
226
24 дек. Cavab 24 dekabrda JoshBerke tərəfindən verilir. 2008-12-24 17:19 '08 at 17:19 2008-12-24 17:19
  • Yalnız abstract dərslər abstract üzvlərə sahib ola bilər.
  • abstract sinifdən devralınan abstract olmayan bir sinif abstract üzvlərini override etməlidir .
  • abstract virtualdir.
  • abstract üzv hər hansı bir tətbiq təqdim edə bilməz ( abstract bəzi dillərdə pure virtual adlanır).
65
16 апр. Mehrdad Afshari tərəfindən 16 apreldə cavab verdi 2009-04-16 12:03 '09 at 12:03 'da 2009-04-16 12:03

Müntəzəm funksiyanı hər zaman yenidən təyin etməlisiniz.

Beləliklə:

  • Abstract funksiyaları - vərəsəçi öz tətbiqini təmin etməlidir
  • Virtual - vekil qərar vermədən əvvəl
47
24 дек. Rinat Abdullin tərəfindən verilmiş cavab 24 dekabr 2008-12-24 17:13 '08 at 17:13 2008-12-24 17:13

Xülasə funksiyası:

  • Yalnız abstrakt sinifdə elan edilə bilər.
  • Yalnız metodun bəyanatı mücərrəd sinifdə tətbiq deyildir.
  • Təbii bir sinifdə yenidən təsvir edilməlidir.

Virtual funksiyası:

  • Müstəs və qeyri-mücərrəd sinif daxilində də elan edilə bilər.
  • Bu metodun tətbiqini ehtiva edir.
  • Bu geri qaytarılacaq.
28
28 мая '14 в 10:52 2014-05-28 10:52 Cavab Lexnim 28 may '14 'də verilir 10:52 2014-05-28 10:52

Xülasə üsulu: Bir sinif mücərrəd bir metoddan ibarət olduqda, bu sinif mücərrəd elan edilməlidir. Xülasə üsulunun tətbiqi yoxdur və buna görə də bu mücərrəd sinifdən çıxarılan dərslər bu mücərrəd üsulun həyata keçirilməsini təmin etməlidir.

Virtual üsul: Bir sinif virtual üsul ola bilər. Virtual üsul bir tətbiqə malikdir. Virtual bir üsula sahib olan bir sinfi devraldığınızda, virtual üsulu köçürə və əlavə məntiq təqdim edə və ya öz tətbiqinizlə məntiq dəyişdirə bilərsiniz.

Nə istifadə edəcəyi zaman: Bəzi hallarda müəyyən növlərin xüsusi bir metodun olması lazım olduğunu bilirsiniz, ancaq bu metodun hansı tətbiqin həyata keçirilməsini bilməyəcəksiniz.
Belə hallarda, bu imza ilə bir metodu olan bir interfeys yarada. Ancaq belə bir vəziyyət varsa, ancaq bu interfeysin inkişaf etdiricilərinin başqa bir ümumi üsula sahib olacağını bilirsiniz (bunun üçün zaten bir tətbiq təmin edə bilərsiniz), bir mücərrəd sinif yarada. Bu mücərrəd sinif daha sonra "ümumi" mantığa malik olan bir üsul və yenidən təsvir edilmiş bir abstrakt metoddan ibarətdir.

Birbaşa istifadə edilə bilən bir sinif varsa, lakin bunun üçün mirasçıların müəyyən davranışı dəyişdirməsini istəyiriksə, virtual üsul istifadə edilməlidir.

26
16 апр. Frederik Gheysels tərəfindən verilmiş cavab 16 aprel 2009-04-16 12:03 '09 at 12:03 'da 2009-04-16 12:03

Müəyyən bir üsul, müəyyən bir sinif yaratmaq üçün tətbiq edilməli olan bir metoddur. Bəyannamə mücərrəd sinifdədir (və abstrakt metodu olan hər hansı bir sinf mücərrəd sinif olmalıdır) və müəyyən bir sinifdə tətbiq edilməlidir.

Virtual bir metod, superclass davranışını əvəz edən overrides istifadə edərək, törəmə bir sinifdə yenidən təyin edilə bilən bir üsuldur. Əgər əvvəlcədən qəbul etməsəniz, orijinal davranışı əldə edəcəksiniz. Əgər etsəniz, həmişə yeni davranışlar əldə edəcəksiniz. Bu qeyri-virtual üsullarla əvəz edilə bilməz, ancaq əsl üsulu gizlədə bilər. Bu new modifikatorla edilir.

Aşağıdakı nümunəyə baxın:

 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"); } } 

DerivedClass bir nümunəsi DerivedClassDerivedClass və ya SayGoodbye , orada "Salam" və "Daha sonra bax" deyirəm. HelloGoodbye , mən "Salam" və "Daha sonra görəcəyəm." Bu, SayGoodbye virtual olduğu və SayGoodbye ilə əvəz edilə bilməsi ilə SayGoodbye . SayHello gizlidir, buna mən əsas sinifdən SayHello mənim orijinal metodu alıram.

Soyut üsullar dolaylı olaraq virtualdir. Onlar bir interfeys kimi daha çox olması lazım olan davranışları təyin edirlər.

21
16 апр. Kamiel Wanrooij tərəfindən verilmiş cavab 16 aprel 2009-04-16 12:13 '09 da 12:13 'de 2009-04-16 12:13

Şərhlər: analogiyalarla. Bu sizə kömək edir.

Kontekst

Mən binanın 21-ci mərtəbəsində işləyirəm. Mən odun haqqında paranoyam. Dünyanın bir yerində zaman zaman atəş bir göydələni yandırır. Xoşbəxtlikdən, buradakı işlərə, yanğın zamanı nə etməli olduğuna dair təlimatlar var:

Fireescape ()

  • Şeyi toplamaq etməyin
  • Yanğın qaçışına gedək.
  • Xəta

Bu, FireEscape () adlı bir virtual üsuldur

Virtual üsul

Bu plan şərtlərin 99% -i üçün olduqca yaxşıdır. Bu, işləyən əsas plandır. Ancaq yanğın çıxdıqda 1% şans var və bu vəziyyətdə tamamilə sıxılırsınız və hər hansı bir qətiyyətli hərəkət etmədiyiniz təqdirdə tost olacaqsınız. Virtual üsullarla, bunu edə bilərsiniz: FireEscape () əsas planını planın öz versiyasını ilə yenidən təyin edə bilərsiniz:

  • Pəncərəyə qaçmaq
  • Çıxış pəncərəsi
  • Aşağıdakı paraşüt təhlükəsizdir

Başqa sözlə, virtual üsullar, ehtiyac duyduğunuz təqdirdə üstəgəl bir əsas plan təmin edir. Subclasses, proqramçı uyğun gördüyü təqdirdə ana sinifin virtual üsulunu ləğv edə bilər.

Abstract üsulları

Bütün təşkilatlar yaxşı qazılmır. Bəzi qurumlar yanğına qarşı döyüş təlimləri etməzlər. Onlar ümumi bir xilasetmə siyasətinə sahib deyillər. Hər kəs özü üçün. Rəhbərlik yalnız belə bir siyasətlə maraqlanır.

Başqa sözlə, hər bir şəxs FireEscape () metodunu inkişaf etdirməyə məcburdur. Bir oğlan xilasetmə qurğusundan çıxacaq. Digər adam bir paraşüt olacaq. Digər adam, binadan uzaqlaşmaq üçün raket sürüş texnologiyasından istifadə edəcək. Digər adam yox olacaq. İdarəetmə, kafi oluna bilmədikdə əsas FireEscape () planına sahib olmağınızdan necə çəkinməyinizə diqqət yetirmir. İSG təşkilata bir ton ton kərpic kimi gələcək. Bu, soyut üsulla nəzərdə tutulur.

İki arasında fərq nədir?

Xülasə metodu: alt siniflər öz FireEscape metodunu tətbiq edirlər. Virtual üsulla, sizin üçün gözləyən əsas plan var, lakin kifayət qədər yaxşı olmadıqda onu həyata keçirə bilərsiniz.

İndi o qədər çətin deyildi?

20
16 июня '16 в 4:01 2016-06-16 04:01 cavab BKSpurgeon 16 iyun 16: 16-da verilir. 2016-06-16 04:01

Abstract üsulları həmişə virtualdir. Onlar həyata keçirilə bilməzlər.

Bu əsas fərqdir.

Ümumiyyətlə, bir default tətbiqiniz varsa, virtual bir üsul istifadə edər və nəsillərin davranışlarını dəyişdirməsini istəyirlər.

Soyut bir üsuldan istifadə edərək, nəsilləri bir həyata keçirmək üçün gücləndirirsiniz.

9
16 апр. cavab Rəşək 16 apr verilir . 2009-04-16 12:00 '09 saat 12: 00-da, 2009-04-16 12:00

Aşağıdakı siniflərdə (digər cavablardan) bir sıra təkmilləşdirmələr edərək daha asanlaşdırdım:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestOO { class Program { static void Main(string[] args) { BaseClass _base = new BaseClass(); Console.WriteLine("Calling virtual method directly"); _base.SayHello(); Console.WriteLine("Calling single method directly"); _base.SayGoodbye(); DerivedClass _derived = new DerivedClass(); Console.WriteLine("Calling new method from derived class"); _derived.SayHello(); Console.WriteLine("Calling overrided method from derived class"); _derived.SayGoodbye(); DerivedClass2 _derived2 = new DerivedClass2(); Console.WriteLine("Calling new method from derived2 class"); _derived2.SayHello(); Console.WriteLine("Calling overrided method from derived2 class"); _derived2.SayGoodbye(); Console.ReadLine(); } } public class BaseClass { public void SayHello() { Console.WriteLine("Hello\n"); } public virtual void SayGoodbye() { Console.WriteLine("Goodbye\n"); } public void HelloGoodbye() { this.SayHello(); this.SayGoodbye(); } } public abstract class AbstractClass { public void SayHello() { Console.WriteLine("Hello\n"); } //public virtual void SayGoodbye() //{ // Console.WriteLine("Goodbye\n"); //} public abstract void SayGoodbye(); } public class DerivedClass : BaseClass { public new void SayHello() { Console.WriteLine("Hi There"); } public override void SayGoodbye() { Console.WriteLine("See you later"); } } public class DerivedClass2 : AbstractClass { public new void SayHello() { Console.WriteLine("Hi There"); } // We should use the override keyword with abstract types //public new void SayGoodbye() //{ // Console.WriteLine("See you later2"); //} public override void SayGoodbye() { Console.WriteLine("See you later"); } } } 
9
07 дек. Cavab 07 dekabr, MeqDotNet-ə verilir. 2011-12-07 12:14 '11 'da 12:14' de 2011-12-07 12:14

Aşağıda göstərildiyi kimi bəzi yerlərdə abstrakt metodu gördük. **

"Soyut üsul bir uşaq sinifində həyata keçirilməlidir

Mən bu kimi hiss etdim.

Müstəsna üsulun uşağın sinifində tətbiq edilməsi vacib deyil , əgər uşaq sinfi də öz əksini tapsa .

1) Abstrakt metod xüsusi bir metod ola bilməz . 2) Abstract cant metodu eyni abstrakt sinifdə həyata keçiriləcəkdir.

Bir abstrakt sinifi tətbiq edərsəniz, abstrakt üsulları əsas mücərrəd sinifdən köçürmək lazımdır. Çünki bir söz ilə əvəzli üsulun həyata keçirilməsi yalnışdır . Bir virtual üsul kimi.

Virtual üsul miras alınmış bir sinifdə tətbiq edilməli deyil.

  ----------CODE-------------- public abstract class BaseClass { public int MyProperty { get; set; } protected abstract void MyAbstractMethod(); public virtual void MyVirtualMethod() { var x = 3 + 4; } } public abstract class myClassA : BaseClass { public int MyProperty { get; set; } //not necessary to implement an abstract method if the child class is also abstract. protected override void MyAbstractMethod() { throw new NotImplementedException(); } } public class myClassB : BaseClass { public int MyProperty { get; set; } //You must have to implement the abstract method since this class is not an abstract class. protected override void MyAbstractMethod() { throw new NotImplementedException(); } } 
3
05 авг. Cavab 05 iyulda Kodoth tərəfindən verilir . 2015-08-05 23:45 '15, saat 11:45 'de, 2015-08-05 23:45

Əsasən, vərəsələrin istədikləri funksiyanı genişləndirmək istədikləri zaman virtual üsuldan istifadə edirsiniz.

Vərdişlərin funksiyaları yerinə yetirmək istədikləri zaman abstrakt üsullardan istifadə edirsiniz (və bu halda onlar üçün heç bir seçim yoxdur)

3
16 апр. Cavab 16 aprel tarixində Brannə verilir. 2009-04-16 12:02 '09 at 12:02 2009-04-16 12:02

Xülasə funksiyası (metod):

Xülasə metodu, mücərrəd bir söz istifadə edərək elan edilmiş bir üsuldur.

● Bədəni yoxdur.

● Təbii sinif tərəfindən həyata keçirilməlidir.

● Əgər üsul abstrakt olsa, sinif özünəməxsus olmalıdır.

virtual funksiyası (metod):

Virtual bir üsul, virtual açar sözü ilə bildirilən bir metoddur və köhnəlmiş açar sözü istifadə edərək, türetilmiş bir sinif üsulu ilə ləğv edilə bilər.

● Təbii sinfi hava şəraitində, yenidən təyin etmək üçün deyil, yox.

2
31 мая '16 в 16:12 2016-05-31 16:12 cavab 31 may 16 : 16-da Kedarnath MS tərəfindən verilir, 2016-05-31 16:12

Yuxarıdakı nümunələrin əksəriyyəti kod istifadə edir və onlar çox yaxşıdır. Mən dediklərinə əlavə etməliyəm, amma aşağıdakılar kodu / texniki şərtləri deyil, analogiyalardan istifadə edən sadə bir izahatdır.

Sadə izahat - Analoqlardan istifadə edən bir izahat

Xülasə metodu

Corc Buşu düşün. O, əsgərlərinə: "İraqda döyüşə get" deyir. Və budur. Bütün göstərdi ki, döyüşmək məcburiyyətindəsiniz. O, bu necə baş verəcəyini dəqiqləşdirmir. Amma demək istəyirəm ki, çıxa bilməzsən və "döyüş" deyə bilməzsiniz: bu nə deməkdir? B-52 və ya mənim derrinerlə mübarizə aparırmı? Bu xüsusi məlumatlar başqasına verilir. Bu abstrakt bir üsuldur.

Virtual üsul

David Petraeus orduda yüksəkdir. O, mübarizə deməkdir:

  • Düşmən tapın
  • Neytrallaşdırın.
  • Bu pivədən sonra

Məsələ ondan ibarətdir ki, bu, çox ümumi bir üsuldur. Bu işləyən yaxşı bir üsuldur, amma bəzən kifayət qədər dəqiq deyil. Petraeus üçün yaxşı bir şey, əmrlərinin fəaliyyət və qabiliyyət azadlığına malik olmasıdır - başqalarına "döyüş" təyini öz xüsusi tələblərinə uyğun olaraq dəyişdirməyə icazə verdi.

Şəxsi iş Bloggs Petraeusun sifarişi oxuyur və döyüşün öz versiyasını xüsusi tələblərinə uyğun həyata keçirmək üçün icazə alır:

  • Düşmən tapın.
  • Başını vur.
  • Əsas səhifəyə keçin
  • Pivə

Nuri Əl Maliki də Petraeusdan eyni əmrləri alır. O da döyüşmək məcburiyyətindədir. Amma bir piyada deyil, siyasətçidir. Aydındır ki, başında siyasi düşmənlərini vura bilməz. Petraeus ona virtual bir üsul verdiyindən, Maliki öz xüsusi şərtlərinə uyğun döyüş metodunun öz versiyasını həyata keçirə bilər:

  • Düşmən tapın.
  • Bir neçə günahkar BS-ni həbs etməsini xahiş et.
  • Əsas səhifəyə keçin
  • Pivə

Başqa sözlə, virtual üsul əmr əmrləri təmin edir - ancaq bunlar, xüsusi şəraitlərə görə ordunun hiyerarxiyasındakı insanlar üçün daha dəqiq ola biləcək ümumi göstərişlərdir.

İki arasında fərq

  • Corc Buş tətbiqetmə detallarını sübut etmir. Başqası tərəfindən edilməlidir. Bu abstrakt bir üsuldur.

  • Digər tərəfdən Petraeus, tətbiq edəcəyi təfərrüatları təmin edir, amma əgər o, daha yaxşı bir şeylə qarşılaşa bilsəydi, onun tabeliyinə tabe olanlara əmrlərini öz versiyası ilə yenidən təyin etməyə icazə verib.

Bu kömək edir.

2
06 мая '16 в 3:48 2016-05-06 03:48 Cavab BKSpurgeon verilir 06 May '16 saat 3:48 2016-05-06 03:48

Soyut bir funksiya bir cəsəd ola bilməz və uşaq sinifləri tərəfindən yenidən təyin edilməlidir.

Virtual funksiya bir cisimə sahib olacaq və uşaq sinifləri tərəfindən ləğv edilə bilməz.

2
12 янв. Cavab Yeasin Abedin Siam 12 yanvarda verilir 2016-01-12 20:17 '16 at 20:17 2016-01-12 20:17

Birləşdirmək bir adın bir parça ilə əlaqələndirilməsi prosesidir.

Daha sonra məcburiyyətimiz adını istifadə etmək deməkdir, ancaq ekranı təxirə salır. Başqa sözlə, biz ilk adı yazırıq və bu adın görünüşünü idarə etmək üçün sonrakı prosesə icazə veririk.

İndi düşünün:

  • İnsanlarla müqayisədə avtomobil axtarışı və çeşidlənməsi baxımından həqiqətən yaxşıdır.
  • Avtomobillərlə müqayisədə, insanlar həqiqətən yaxşı yaradılar və zəriflik edirlər.

Belə ki, qısa cavabdır: virtual maşına bağlanmaq üçün gecikmə təlimatıdır (işləmə), abstract bir şəxs üçün (proqramçı) son bağlanma təlimatıdır,

Başqa sözlə, virtual vasitələr:

"Hörmətli qurğuşun vaxtı , ən yaxşı əməllərinizi etməklə müvafiq kodu bu adı ilə birləşdirin: axtarış"

abstract deməkdir:

"Hörmətli proqramçı Xahiş edirik, ən yaxşısını edərkən müvafiq adı bu adla bağlayın:

Tamamlanma üçün aşırı yükləmə vasitələri deməkdir:

"Hörmətli tərtibatçı , müvafiq kodunuzu bu adla bağlayın, sizin üçün ən yaxşı işi edin: axtarış (və sıralama)."

2
13 авг. 13 Avqustda Rodrick Chapman tərəfindən verilmiş cavab 2017-08-13 23:06 '17 at 11:06 2017-08-13 23:06

Ümumi obyekt yönümlü baxımdan:

Xülasə üsuluna gəldikdə . Üst sinfdə abstrakt bir metod qoyduğunuzda, siz uşaq siniflərini deyirsiniz: Hey, belə bir üsul imza sahibi olduğunuzu qeyd edin. Və onu istifadə etmək istəyirsinizsə, öz həyata keçirməliyik!

Virtual funksiyaya gəldikdə : bir ana sinifdə virtual bir üsul qoyduğunuzda, əldə edilən dərslərə deyirsiniz: Hey, burada sizin üçün bir şey olan funksionallıq var. Bu faydalı olarsa, onu istifadə edin. Əgər yoxsa, onu yenidən təyin edin və kodunuzu daxil edin, hətta kodunuzda mənim tətbiqi istifadə edə bilərsiniz!

bu, ümumi OO-da bu iki anlayış arasındakı fərq haqqında bir neçə fəlsəfədir

1
01 марта '17 в 13:35 2017-03-01 13:35 Cavab Məhəmməd Nikraveşin 01 mart 'da 13:35' də verilməsi 2017-03-01 13:35

Heç bir şey C # -də virtual bir sinfə səbəb olur.

Funksiyalar üçün

1.Əsas funksiyası yalnız imza daşıyır, disk sinfi funksionallıqla yenidən müəyyənləşdirilməlidir. 2. Virtual funksiya funksionallığın bir hissəsini ehtiva edəcək, disk sinfi tələbə uyğun olaraq onu ləğv edə bilər və ya qəbul edə bilməz.

Siz tələbinizlə qərar verə bilərsiniz.

1
07 июня '16 в 17:41 2016-06-07 17:41 Cavab Nithila Shanmugananthan tərəfindən 07 İyun '17' də 17:41 2016-06-07 17:41 'də verilir

Cavab bir neçə dəfə verilmişdir, lakin hər birinin vaxtından istifadə etməsi məsələsi vaxt tərtibatının həllidir. Mən ümumi üsul anlayışlarını müxtəlif interfeyslərə birləşdirməyə və müvafiq səviyyədə abstraksiya ilə dərslərə çəkməyə çalışmaq üçün yaxşı bir təcrübə hesab edirəm. Bir sütun daxilində ümumi bir abstrakt və virtual üsul təsvirləri yığması, sıxılmış interfeyslər qrupunu tətbiq edən qeyri-mücərrəd sinfi müəyyən etmək üçün yaxşı olduğunda sinfi qeyri-sabit edir. Həmişə olduğu kimi, bu sizin xüsusi tətbiqinizə ən yaxşı uyğun olduğundan asılıdır.

1
19 авг. cavab Gelin 19 avqustda verilir . 2013-08-19 13:28 '13 at 13:28 2013-08-19 13:28

Anladığım kimi:

Abstract üsulları:

Yalnız bir mücərrəd sinif mücərrəd üsulları ehtiva edə bilər. Bundan əlavə, törəmə sinif metodu həyata keçirməli və tətbiq sinifdə tətbiq edilməməlidir.

Virtual üsullar:

Sınıf onlara bəyan edə bilər, habelə onların həyata keçirilməsini təmin edə bilər. Bundan başqa, törəmə bir sinif onu ləğv etmək üçün bir üsul tətbiq etməlidir.

-2
27 июня '11 в 18:37 2011-06-27 18:37 Cavab Qeyser tərəfindən 27 iyun 'da 18:37' də verildi 2011-06-27 18:37