Çoklu kalıtım kötü olduğundan (kaynağı daha karmaşık hale getirir) C # böyle bir modeli doğrudan sağlamaz. Ancak bazen bu yeteneğe sahip olmak yardımcı olabilir.
Örneğin, arayüzleri ve bunun gibi üç sınıfı kullanarak eksik çoklu kalıtım modelini uygulayabiliyorum:
public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }
public class First:IFirst
{
public void FirstMethod() { Console.WriteLine("First"); }
}
public class Second:ISecond
{
public void SecondMethod() { Console.WriteLine("Second"); }
}
public class FirstAndSecond: IFirst, ISecond
{
First first = new First();
Second second = new Second();
public void FirstMethod() { first.FirstMethod(); }
public void SecondMethod() { second.SecondMethod(); }
}
Arabirimlerden birine bir yöntem eklediğimde, FirstAndSecond sınıfını da değiştirmem gerekiyor .
Birden fazla mevcut sınıfı C ++ 'da olduğu gibi yeni bir sınıfa enjekte etmenin bir yolu var mı?
Belki bir tür kod üretimi kullanan bir çözüm var mı?
Veya şu şekilde görünebilir (hayali c # sözdizimi):
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
Arabirimlerden birini değiştirdiğimde FirstAndSecond sınıfını güncellemeye gerek kalmayacak.
DÜZENLE
Belki de pratik bir örnek düşünmek daha iyi olur:
Projenizdeki farklı konumlarda zaten kullandığınız mevcut bir sınıfınız (örn. ITextTcpClient tabanlı metin tabanlı bir TCP istemciniz) var. Artık Windows form geliştiricileri için kolay erişilebilir olması için sınıfınızın bir bileşenini oluşturma gereğini hissediyorsunuz.
Bildiğim kadarıyla şu anda bunu yapmak için iki yol var:
FirstAndSecond ile gösterildiği gibi sınıfın bir örneğini kullanarak, bileşenlerden devralınan ve TextTcpClient sınıfının arabirimini uygulayan yeni bir sınıf yazın.
TextTcpClient'ten devralınan ve bir şekilde IComponent'i uygulayan yeni bir sınıf yazın (bunu henüz denemedim).
Her iki durumda da, sınıf başına değil, yöntem başına çalışma yapmanız gerekir. TextTcpClient ve Component'in tüm yöntemlerine ihtiyacımız olacağını bildiğiniz için, bu ikisini tek bir sınıfta birleştirmek en kolay çözüm olacaktır.
Çatışmalardan kaçınmak için bu, sonucun daha sonra değiştirilebileceği kod üretimi ile yapılabilir, ancak bunu elle yazmak eşek için saf bir acıdır.