C # 'da soyut bir sınıf ve arabirim ne zaman kullanılır?

Uygulamaları tasarlarken, soyut bir sınıfın ne zaman ve bir arayüzün ne zaman kullanılacağını bilmek önemlidir. Soyut sınıflar ve arayüzler bazı yönlerden benzer görünse de, başarmaya çalıştığınız şey için hangisinin en iyi seçim olduğunu belirleyecek temel farklılıklar vardır. Bu blog yazısında bu farklılıkları ve hangisinin ne zaman kullanılacağına nasıl karar vereceğimi tartışacağım.

Kısa cevap: Soyut bir sınıf, alt sınıfların uygulayabileceği veya geçersiz kılabileceği işlevler oluşturmanıza olanak tanır. Bir arayüz sadece işlevselliği tanımlamanıza izin verir, onu uygulamanıza izin vermez. Ve bir sınıf yalnızca bir soyut sınıfı genişletebilirken, birden çok arabirimden yararlanabilir. 

C # soyut sınıf açıklaması

Soyut bir sınıf, somutlaştırılamayan özel bir sınıf türüdür. Soyut bir sınıf, yöntemlerini uygulayan veya geçersiz kılan alt sınıflar tarafından miras alınacak şekilde tasarlanmıştır. Diğer bir deyişle, soyut sınıflar ya kısmen uygulanır ya da hiç uygulanmaz. Soyut sınıfınızda işlevselliğe sahip olabilirsiniz - soyut bir sınıftaki yöntemler hem soyut hem de somut olabilir. Soyut bir sınıfın kurucuları olabilir — bu, soyut bir sınıf ile bir arayüz arasındaki önemli bir farktır. Bileşenleri tasarlamak ve türetilmiş sınıflar tarafından uygulanması gereken bazı ortak işlevsellik düzeylerini belirtmek için soyut sınıflardan yararlanabilirsiniz.

C # arayüzü açıkladı

Arayüz temelde bir sözleşmedir - herhangi bir uygulaması yoktur. Bir arabirim yalnızca yöntem bildirimlerini içerebilir; yöntem tanımlarını içeremez. Bir arayüzde herhangi bir üye verisine sahip olamazsınız. Soyut bir sınıf, yöntem tanımlarını, alanları ve yapıcıları içerebilirken, bir arabirim yalnızca olayların, yöntemlerin ve özelliklerin bildirimlerine sahip olabilir. Bir arabirimde bildirilen yöntemler, arabirimi uygulayan sınıflar tarafından uygulanmalıdır. Bir sınıfın birden fazla arabirim uygulayabileceğini, ancak yalnızca bir sınıfı genişletebileceğini unutmayın. Arabirimi uygulayan sınıf, tüm üyelerini uygulamalıdır. Soyut bir sınıf gibi, bir arabirim de somutlaştırılamaz.

Soyut bir sınıf mı yoksa bir arayüz mü kullanmalıyım?

Soyut sınıflar, belirli somut yöntemlere ve türetilmiş sınıfların uygulaması gereken diğer bazı yöntemlere sahip olma esnekliği sağlar. Aksine, arabirimler kullanıyorsanız, arabirimi genişleten sınıfta tüm yöntemleri uygulamanız gerekir. Soyut bir sınıf, gelecekteki genişleme planlarınız varsa, yani sınıf hiyerarşisinde gelecekteki bir genişleme olasılığı varsa iyi bir seçimdir. Arayüzleri kullanırken gelecekteki genişletmeler için destek sağlamak isterseniz, arayüzü genişletmeniz ve yeni bir tane oluşturmanız gerekir.

Farklı bir kayda göre, gerekirse hiyerarşiye yeni bir arayüz eklemek kolaydır. Bununla birlikte, hiyerarşinizde zaten bir soyut sınıfınız varsa, başka bir sınıf ekleyemezsiniz - yani, yalnızca mevcut değilse soyut bir sınıf ekleyebilirsiniz. Bazı davranışlar veya işlevler için bir sözleşme istiyorsanız bir arayüz kullanmalısınız. Arayüz yöntemleri için aynı kodu yazmanız gerekiyorsa arayüz kullanmamalısınız. Bu durumda, soyut bir sınıf kullanmalı, yöntemi bir kez tanımlamalı ve gerektiğinde yeniden kullanmalısınız. Uygulamanızın kodunu belirli uygulamalarından ayırmak veya belirli bir türdeki üyelere erişimi kısıtlamak için arayüzler kullanın.

Microsoft'un arayüz belgelerinde belirtildiği gibi:

Arayüzleri kullanarak, örneğin, bir sınıfa birden çok kaynaktan gelen davranışı dahil edebilirsiniz. Bu yetenek C # için önemlidir çünkü dil, sınıfların çoklu kalıtımını desteklemez. Ek olarak, yapılar için kalıtımı simüle etmek istiyorsanız bir arabirim kullanmanız gerekir, çünkü bunlar aslında başka bir yapı veya sınıftan miras alamazlar.

Örtük ve açık arabirim uygulamaları

Arayüzler örtük veya açık bir şekilde uygulanabilir. Bu iki uygulamanın nasıl farklı olduğunu açıklayayım. Adlı bir arayüz düşünün IBusinessLogic.

genel arayüz IBusinessLogic

{

   void Initialize ();

}

Aşağıdaki isimli sınıf BusinessLogic, IBusinessLogicarayüzü uygular .

genel sınıf BusinessLogic: IBusinessLogic

{

   public void Initialize ()

   {

       // Bazı kodlar

   }

}

BusinessLogicAçıkça sınıfın bir örneğini oluşturabilir ve ardından Initialize()aşağıda gösterildiği gibi yöntemi çağırabilirsiniz .

 IBusinessLogic businessLogic = new BusinessLogic ();

businessLogic.Initialize ();

Aşağıdaki kod parçacığı, IBusinessLogicarabirimi örtük olarak nasıl uygulayabileceğinizi gösterir .

genel sınıf BusinessLogic: IBusinessLogic

{

   void IBusinessLogic.Initialize ()

   {

   }

}

Artık Initialize(), IBusinessLogicarabirime bir başvuru kullanarak yöntemi aynı şekilde başlatabilirsiniz . İki yaklaşımın farkı, arabirimi açıkça sınıfınızda uyguladığınızda, yalnızca arabirime bir başvuru kullanarak arabiriminizin bir yöntemini çağırmakla sınırlandırılmış olmanızdır. Bu nedenle aşağıdaki kod parçacığı çalışmaz, yani derlenmez.

 BusinessLogic businessLogic = new BusinessLogic ();

businessLogic.Initialize ();

C # ile daha fazlasını nasıl yapabilirsiniz:

  • C # 'da soyut bir sınıf ve arabirim ne zaman kullanılır?
  • C # 'da AutoMapper ile nasıl çalışılır
  • C # 'da lambda ifadeleri nasıl kullanılır
  • C # 'ta Action, Func ve Predicate temsilcileriyle nasıl çalışılır?
  • C # 'da temsilcilerle nasıl çalışılır
  • C # 'da basit bir kaydedici nasıl uygulanır
  • C # 'da özniteliklerle nasıl çalışılır
  • C # 'da log4net ile nasıl çalışılır
  • Depo tasarım modeli C # 'da nasıl uygulanır?
  • C # 'da yansıma ile nasıl çalışılır
  • C # 'da dosya sistemi gözlemcisi ile nasıl çalışılır
  • C # 'da geç başlatma nasıl gerçekleştirilir
  • C # 'da MSMQ ile nasıl çalışılır
  • C # 'da uzatma yöntemleriyle nasıl çalışılır
  • C # 'da lambda ifadeleri nasıl kullanılır
  • Volatile anahtar kelime C # 'da ne zaman kullanılır?
  • C # 'da getiri anahtar kelimesi nasıl kullanılır
  • C # 'da polimorfizm nasıl uygulanır?
  • C # 'da kendi görev zamanlayıcınızı nasıl oluşturabilirsiniz?
  • C # 'da RabbitMQ ile nasıl çalışılır
  • C # 'da bir demet ile nasıl çalışılır
  • C # 'da sanal ve soyut yöntemleri keşfetmek