|
|
Yayınlandı 22.04.2019 14:41:09
|
|
|

Yorum 1
C#'da Soyut ve Sanal kafa karıştırıcıdır, her ikisi de kalıtımla ilgili ve geçersiz bir çözüm kullanılır. İkisi arasındaki farkları tartışalım:
1. Sanal yöntem
sanal anahtar kelime, temel sınıftaki metotları değiştirmek için kullanılır. Sanal olarak kullanılan iki durum vardır:
Senaryo 1: Sanal bir metod temel sınıfta tanımlanır, ancak sanal yöntem türetilmiş sınıfta yeniden yazılmaz. Türetilmiş sınıf örneğine çağrı yapıldığında, sanal yöntem temel sınıf tarafından tanımlanan yöntemi kullanır.
Senaryo 2: Temel sınıfta sanal bir metod tanımlanır ve ardından türetilmiş sınıfta geçersiz hale getirilerek metod yeniden yazılır. Türetilmiş sınıf örneğine çağrıda, sanal yöntem türetilmiş yeniden yazma yöntemini kullanır.
2. Soyut yöntem (soyut yöntem)
Soyut anahtar kelime yalnızca soyut sınıflarda metotları değiştirmek için kullanılabilir ve özel bir uygulama yoktur. Soyut yöntemlerin uygulanması, türetilmiş sınıftaki geçersiz anahtar kelime kullanılarak uygulanmalıdır.
Arayüz ile soyut sınıf arasındaki en temel fark: soyut sınıf, eksik bir sınıftır, bir nesnenin soyutlamasıdır, arayüz ise davranışsal bir normdur.
3. Anahtar kelimeler
Statik: Bir metod Statik olarak ilan edildiğinde, o yöntem statik bir yöntemdir ve derleyici derleme sırasında yöntemin uygulanmasını korur. Yani, yöntem bir sınıfa aittir, ancak herhangi bir üyeye ait değildir; sınıfın bir örneği var olup olmamasından bağımsız olarak. Statik void Ana giriş fonksiyonu gibi, statik bir fonksiyon olduğu için doğrudan çağrılabilir.
Virtua: Bir metod Sanal olarak ilan edildiğinde, ClassName değişkeni = yeni ClassName() kullanılana kadar sanal bir metoddur; Bir sınıfın örneği ilan edilmeden önce, gerçek bellek alanında mevcut değildir. Bu anahtar kelime, sınıf kalıtımında sınıf yöntemleri için polimorfizm desteği sağlamak amacıyla çok yaygın olarak kullanılır.
overrride: yeniden yazmayı gösterir Bu sınıf Shape sınıfından miras alır Sanal, özet, ondan miras almak isteyen diğer sınıflara bu yöntemi veya özelliğimi geçersiz kılabileceğinizi söylemek, aksi takdirde izin verilmez. Özet: Soyut Metod Bildirmesi, türevden türetilen bir sınıf tarafından geçersiz kılılması gereken bir yöntemdir ve bu sınıf miras almak için kullanılır; Bu, gerçekleşmeden hayali bir yöntem olarak değerlendirilebilir; Bir sınıf soyut bir metod içeriyorsa, o zaman sınıf soyut bir sınıf olarak tanımlanmalıdır; diğer genel yöntemler içerse de içermese de; Soyut sınıflar maddeye sahip olamaz.
a) Sanal modifikasyon yöntemi bir yöntem uygulamasına sahip olmalıdır (sadece bir çift braket olsa bile) ve soyut modifikasyon yönteminin bir uygulaması olamaz.
b) sanal alt sınıflar tarafından yeniden yazılabilir, özet alt sınıflar tarafından yeniden yazılmalıdır
c) Bir sınıftaki bir fonksiyon abstact ile değiştirilirse, sınıf adı da abstact ile değiştirilmelidir
d) Soyut değiştirilmiş sınıflar örnek oluşturulamaz.
e) Eğer C# içinde bir metod, alt sınıftaki ana sınıfı yeniden yazmaya hazırlanırsa, yöntem ana sınıfta sanal ile değiştirilmeli ve alt sınıfta overide ile değiştirilmelidir; böylece programcı ana sınıfın ana sınıfının ana metodunu yanlışlıkla alt sınıfta yeniden yazmasını önlüyor.
Not: Soyutla değiştirilen sınıflar yalnızca kalıtsal olabilir, örneklenmez.
Yorum 2
Hem sanal hem de soyut sınıflar ana sınıfı değiştirmek için kullanılır; böylece ana sınıfın tanımını geçersiz kılarak alt sınıf yeniden tanımlanabilir.
Ortak bir noktaları vardır: Eğer metotları değiştirmek için kullanılırlarsa, önüne public eklenmelidir, aksi takdirde derleme hataları olur: sanal metodlar veya soyut metotlar özel olamaz. Sonuçta, sanal veya soyut eklemek alt sınıfın yeniden tanımlanmasına olanak tanır ve alt sınıf özel üyelere erişemez.
Ama çok farklılar. (sanal "sanal", soyut "soyyut"dur).
(1) Sanal modifikasyon yöntemi uygulanmalıdır (sadece bir çift diş teleği eklese bile), soyut modifikasyon yöntemi ise uygulanmamalıdır. Örneğin, sanal modifikasyon yöntemi uygulanmazsa:
Hata: "Test1.fun1()" gövdeyi bildirmek zorundadır çünkü soyut olarak işaretlenmemiştir, dışsal veya kısmi olarak işaretlenmemiştir
Soyut değiştiriciler için, uygulanırsa:
Hata: "Test2.fun2()" gövdeyi soyut olarak işaretlendiği için bildiremez
(2) sanal alt sınıflar tarafından yeniden yazılabilirken, özet alt sınıflar tarafından yeniden yazılmalıdır.
Derlemede hata yoktur, sanal modifikatör yöntemi yeniden yazılırsa, önüne geçersiz kılma eklenmelidir (bu da derleyiciye sanal yöntemi yeniden yazmak istediğinizi bildirir) ve bir uygulama olmalıdır, aksi takdirde derleme yanlış olur:
(3) Bir sınıf üyesi soyut ile değiştirilirse, özet sınıfın önüne eklenmelidir, çünkü sadece soyut sınıflar soyut metotlara sahip olabilir.
(4) Soyut sınıfların örnekleri oluşturulamaz, sadece miras alınabilir ve örneklenemezler, örneğin: BaseTest2 base2 = yeni BaseTest2(); Bir derleme hatası olur: Soyut sınıf veya arayüz örnek oluşturamaz.
(5) C#'da, bir alt sınıfta bir metodu yeniden yazmak istiyorsanız, ana metotun önüne sanal eklemeli ve alt sınıf metodundan önce geçersiz hale getirmelisiniz, böylece programcılar ana metotu yanlışlıkla alt sınıfta yeniden yazmamalıdır.
(6) Soyut yöntem üzerine yazılmalıdır ve sanal yöntemin bir uygulaması olmalı (soyut sınıfta tanımlanmış bir metod olsa bile).
Yorum 3 Benzerlikler: 1. Hepsi miras kalabilir 2. Hiçbiri oluşturulamaz 3. Metod bildirimleri içerebilir 4. Türev, gerçekleşmemiş yöntemleri uygulamalıdır Ayırt etmek: 1. Soyut temel sınıflar alanlar, öznitelikler ve metod uygulamalarını tanımlayabilir. Arayüzler yalnızca öznitelikleri, indeksleyicileri, olayları ve metod bildirimlerini tanımlayabilir ve alan içeremez. 2. Soyut sınıf, daha da geliştirilmesi gereken eksik bir sınıftır, arayüz ise davranışsal bir normdur. Microsoft'un özel arayüzleri her zaman "Yapabilirim..." ifadesinin ifadesi olduklarını kanıtlayan yetenekli bir alanla gelir. ” 3. Arayüzler birden fazla kez uygulanabilir ve soyut sınıflar yalnızca tek bir kişi tarafından devralınabilir 4. Soyut sınıflar daha çok birbirine yakın olan bir dizi sınıf arasında tanımlanırken, arayüzlerin çoğu gevşek şekilde ilişkilidir ancak hepsi belirli bir fonksiyonu uygular 5. Soyut sınıflar, birbirine bağlı nesneler dizisinden soyutlanmış kavramlardır; bu nedenle nesnelerin içsel ortaklığını yansıtırlar; Arayüz, dış çağrıları karşılamak için tanımlanan fonksiyonel bir konvensiyondur ve bu nedenle nesnelerin dış özelliklerini yansıtır 6. Arayüz temelde belirli bir kalıtım özelliğine sahip değildir, sadece çağrılabilecek bir yöntem vaat eder 7. Arayüz geri çağrıları desteklemek için kullanılabilir, ancak miras alma bu özelliğe sahip değildir 8. Soyut sınıflar tarafından uygulanan özel yöntemler varsayılan olarak sanal olsa da, arayüzü uygulayan sınıftaki arayüz yöntemleri varsayılan olarak sanal değildir, tabii ki onları sanal olarak da ilan edebilirsiniz 9. Eğer soyut sınıf arayüzü uygularsa, arayüzdeki metod özet sınıfa uygulanmadan soyut bir yöntem olarak eşlenebilir, ancak arayüzdeki metod soyut sınıfın alt sınıfında uygulanabilir Kullanım kuralları: 1. Soyut sınıflar esas olarak yakın ilişkili nesneler için kullanılırken, arayüzler en iyi şekilde alakasız sınıflar için genel işlevsellik sağlamak için kullanılır 2. Büyük bir fonksiyonel birim tasarlamak istiyorsanız, soyut sınıflar kullanın; Küçük, özlü fonksiyonel bloklar tasarlamak istiyorsanız, arayüzler kullanın. 3. Bileşenin birden fazla versiyonunun oluşturulması bekleniyorsa, soyut bir sınıf oluşturun. Bir arayüz oluşturulduktan sonra değiştirilemez. Eğer yeni bir arayüz sürümü gerekiyorsa, tamamen yeni bir arayüz oluşturulmalıdır. 4. Oluşturulan fonksiyon çok çeşitli heterojen nesneler arasında kullanılacaksa, arayüzü kullanın; Bir bileşenin tüm uygulamalarında ortak uygulanan işlevsellik sağlamak istiyorsanız, soyut sınıflar kullanın. 5. Nesneyi analiz et, iç ortaklığı inceleyerek soyut bir sınıf oluştur, bu sınıf nesnenin özünü ifade etmek için kullanılır, yani "ne". Arayüzler, harici çağrılar veya fonksiyonlar genişletilmesi gerektiğinde önceliklendirilir 6. İyi bir arayüz tanımı çok işlevli değil, spesifik ve işlevsel olmalıdır; aksi takdirde arayüz kirliliğine yol açar. Bir sınıf arayüzün yalnızca bir fonksiyonunu uygularsa, ancak arayüzde başka yöntemler de uygulamak zorundaysa, buna arayüz kirliliği denir 7. Formasyon fonksiyonunu elde etmek için kalıtımı kullanmaktan kaçının, ancak siyah kutu çoklu katmanlama, yani nesne kombinasyonu kullanın. Miras seviyelerinin sayısındaki artış nedeniyle, bu taksondaki bir sınıfı çağırdığınızda hepsini yığına yüklemeniz gereken en doğrudan sonuç! Sonuçları hayal edilebilir. (Yığın prensip anlayışıyla birleşince). Aynı zamanda, ilgilenen arkadaşlar, Microsoft'un sınıf oluştururken nesne birleştirme yöntemini sıkça kullandığını fark edebilir. Örneğin, asp.net'de Page sınıfının Sunucu İsteği gibi özellikleri vardır, ancak aslında hepsi belirli bir sınıfın nesneleridir. Page sınıfının bu nesnesini kullanarak diğer sınıfların metod ve özelliklerini çağırmak çok temel bir tasarım ilkesidir Mesela: Pencere formları soyut sınıflarla tasarlanabilir ve genel işlemler ile özellikler soyut bir sınıfa yerleştirilebilir; böylece form ve diyalog kutusu bu soyut sınıftan miras alabilir ve kendi ihtiyaçlarına göre genişletip geliştirilebilir.
Baskı işlemi, bu fonksiyona ihtiyaç duyan her forma arayüz olarak sağlanabilir, çünkü formun içeriği farklıdır ve kendi baskı fonksiyonlarını kendi gereksinimlerine göre uygulamak zorundadırlar. Yazdırılırken, hangi formun basıldığı fark etmeksizin sadece arayüz üzerinden çağrılır.
Ortaklık, Bireysellik ve Seçim: Bazı kitaplar, C#'ın soyut temel sınıflar yerine arayüz kullanımını önerdiğini yazıyor ve arayüz kullanmanın birçok faydasını vurguluyor; ki buna katılmaya cesaret edemem; yukarıdaki listeden iki farklı arasında hâlâ birçok fark vardır ve bu farkın varlığı, uygulanabilir senaryolarda farkı belirlemelidir; örneğin, soyut temel sınıf bazı yöntemler için varsayılan uygulamalar sağlayabilir, böylece alt sınıflarda tekrar uygulanmasını önlemek ve kodun yeniden kullanılabilirliğini artırmak sağlanır. Bu, soyut sınıfların avantajıdır; Arayüz yalnızca soyut metodlar içerebilir. Soyut temel sınıfların ne zaman kullanılacağı ve arayüzlerin ne zaman kullanılacağı konusunda, kullanıcıların miras alınan sınıflar arasındaki bağlantıları nasıl gördüğüne, kişilik farklılıkları mı yoksa aralarındaki ortak bağlantılar mı olduğuna bağlıdır. Hayat örneğiyle bunu anlatayım.
Eğer size insanlar, balıklar ve kurbağalar olmak üzere üç nesne verilirse ve onlar için bir temel kategori tasarlamanız istenirse, aralarındaki bağlantıyı özetlemek için ilk hissedeceğiniz şey aralarında büyük farklar olduğu ve ortak noktaları soyutlamanın zor olmasıdır. Burada soyut temel sınıflar yerine arayüzleri kullanmayı düşünmelisiniz, çünkü üç sebepten doludur:
1. Bireylik, ortaklıktan daha büyüktür. 2. Büyük farklılıklara sahip kişilikler de benzer davranışlara sahiptir. 3. Aynı davranışın gerçekleşme yöntemlerinde büyük farklılıklar vardır. Bu sırada, size üç nesne daha veriliyor: crucian sazan, sazan ve japon balığı, ve yine de aralarındaki bağlantıyı özetlemek için temel sınıflar tasarlamanıza izin veriliyor, sonra fark ettiğiniz ilk şey hepsinin balıklara ait olduğu, ikincisi ise yüzme şekillerinin biraz farklı olabileceği, bu yüzden arayüzler yerine soyut temel sınıflar kullanmalısınız, yukarıdaki örneğe kıyasla üç sebep var:
1. Ortak ortaklık bireysellikten daha büyüktür 2. Aynı ortak özelliklere sahip bireylerin aynı niteliklere ve davranışlara sahip olması gerekir 3. Aynı davranışın uygulama yöntemlerinde bazı farklılıklar vardır Arayüzler veya soyut temel sınıfların kullanılmasının birkaç nedeni arasında, üçüncü neden aslında aynıdır; nesne yönelimli sistemde polimorfizm kavramını tanımlar; yani, ana sınıfın geçersiz kılılması ve geçilen nesne referansına göre çalışma zamanında ilgili yöntemin çağrılmasıyla uygulanmasıdır. İkinci neden ise ayrılmaya başlar; arayüzler miras alınan nesneler arasında aynı davranışı vurgularken, soyut sınıflar da aynı özellikleri devralan nesneler arasında vurgular. Arayüzleri soyut temel sınıflardan ayıran şey şu nedenlerdir:
Arayüzler, büyük farklara sahip nesneler arasında işlevsel ortak arama arandığında kullanılır. Soyut temel sınıflar, daha ortak nesneler arasında fonksiyonel farklılıklar arandığında kullanılır. Aynı ve farklıyı karşılaştırarak, arayüzlerin ve soyut sınıfların kendi güçlü yönleri olduğunu söyleyebiliriz, ancak avantajları yoktur. Gerçek programlama pratiğinde, yeteneklerimizi özel duruma göre ölçmemiz gerekiyor, ancak aşağıdaki deneyim ve birikim size biraz ilham verebilir; benim birikimin bir kısmına ek olarak, çoğu klasiklerden geliyor, sınavlara dayanabileceklerine inanıyorum. Yani kurallarda ve etkinliklerde bu klasikleri öğreniyoruz, en önemli şey öğrendiklerimizi uygulamak, tabii ki bir ailenin sözleriyle herkesin kahkahasını kazanacağım, lütfen devam edin.
Kurallar ve etkinlikler: 1. Nesne yönelimli düşüncenin en önemli ilkelerinden birinin arayüz odaklı programlama olduğunu unutmayın. 2. Arayüzler ve soyut sınıfların yardımıyla, 23 tasarım desenindeki birçok fikir zekice uygulandı ve bence özlerinin sadece soyut programlamaya yönelmiş olmalarından kaynaklanıyor. 3. Soyut sınıflar esas olarak yakın ilişkili nesneler için kullanılmalıdır, arayüzler ise alakasız sınıflar için genel işlevsellik sağlamak için en iyi şekilde kullanılır. 4. Arayüz CAN-DO ilişki türüne odaklanırken, soyut sınıf IS-A ilişkisine odaklanır. 5. Arayüzdeki çoklu tanımlı nesnelerin davranışı; soyut sınıflar nesnelerin özelliklerini çoklu tanımlar; 6. Arayüz tanımları kamu, korunucul, iç ve özel modifikatörler kullanabilir, ancak neredeyse tüm arayüzler halka açık olarak tanımlanır, bu yüzden daha fazla şey söylemeye gerek yoktur. 7. "Arayüz değişmeden kalır" dikkate alınması gereken önemli bir faktördür. Bu nedenle, arayüzlerden uzantılar eklendiğinde, mevcut arayüzler değil, yeni arayüzler eklenmelidir. 8. Arayüzü tek bir fonksiyonlu fonksiyonel blok olarak tasarlamaya çalışın; örneğin .NET Framework'ü alarak, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable vb. hepsi yalnızca bir ortak yöntem içerir. 9. Arayüz adının önündeki büyük harf "I" bir gelenektir; tıpkı alan adının alt çizgiyle başlaması gibi, lütfen bu ilkelere uyun. 10. Arayüzde tüm yöntemler varsayılan olarak halka açılır. 11. Sürüm sorunları beklenirse, bir "soyut sınıf" oluşturabilirsiniz. Örneğin, bir köpek, bir tavuk ve bir ördek yaratıyorsanız, gelecekte ortaya çıkabilecek şeylerle başa çıkmak için hayvanları soyutlamayı düşünmelisiniz. Arayüze yeni üyeler eklendiğinde, tüm türeme sınıflar değiştirilip yeniden derlenmek zorunda kalır, bu nedenle sürüm sorunları en iyi şekilde soyut sınıflarla uygulanır. 12. Soyut sınıflardan türetilen soyut olmayan sınıflar, tüm miras alınan soyut yöntemleri ve soyut erişimcilerin gerçek uygulamalarını içermelidir. 13. Yeni anahtar kelime soyut sınıflar için kullanılamaz ve mühürlenemezler, çünkü soyut sınıflar örneklenemez. 14. Statik veya sanal modifikatörler soyut metod bildirimlerinde kullanılamaz.
|
Önceki:C# Enum Simple Permission Design, FlagsAttribute özelliğini kullanırÖnümüzdeki:Huang Yong'un Yiyun sınıfı, WeChat mini programının sıfır temelli bir anlayışına sahip
|