2010-08-13 25 views
6

C# geliştirici olarak çalıştığım için, Interface kullanarak multiple inheritance uygulayabildiğimizi biliyorum.C# içinde birden fazla kalıtım #

multiple inheritance'un C# ile nasıl bağlantı kurulacağını öğrenmek için lütfen bana bir link verin.

Interface kullanımıyla C# numaralı belgede birden çok devralmaya nasıl ulaşılacağını öğrenmek istiyorum.

Şimdiden teşekkürler.

+8

C# içinde birden çok arabirim uygulayabilirsiniz, ancak yalnızca bir sınıftan devralabilirsiniz. – 7wp

+11

Birden çok arabirimi uygulamak, birden çok "mirasa" eşit olur mu? Uygula ve Devral, iki tamamen farklı şeylerdir –

+0

@Hasan: 'tamamen' değil, bir arabirimden devralma, ikame ilkesini karşılar. –

cevap

7

İşte size güzel bir örnek.

http://blog.vuscode.com/malovicn/archive/2006/10/20/How-to-do-multiple-inheritance-in-C_2300_-2D00-Implementation-over-delegation-_2800_IOD_2900_.aspx

Hızlı bir kod önizleme: Birden arayüzleri uygulanması

interface ICustomerCollection 
{ 
     void Add(string customerName); 
     void Delete(string customerName); 
} 

class CustomerCollection : ICustomerCollection 
{ 
     public void Add(string customerName) 
     { 
      /*Customer collection add method specific code*/ 
     } 
     public void Delete(string customerName) 
     { 
      /*Customer collection delete method specific code*/ 
     } 
} 

class MyUserControl: UserControl, ICustomerCollection 
{ 
     CustomerCollection _customerCollection=new CustomerCollection(); 

     public void Add(string customerName) 
     { 
      _customerCollection.Add(customerName); 
     } 
     public void Delete(string customerName) 
     { 
      _customerCollection.Add(customerName); 
     } 
} 
12

Kesinlikle birden miras değil - ama C# sınıfı birden arayüzleri uygulayabilir, bu doğru: Sen sen arayüzleri tüm tanımlanan tüm yöntemlerde (ve özellikleri) için uygulamaları sağlamak için gereken

public class MyClass : BaseClass, IInterface1, IInterface2, IInterface3 
{ 
    // implement methods and properties for IInterface1 
    .. 

    // implement methods and properties for IInterface2 
    .. 

    // implement methods and properties for IInterface3 
    .. 
} 

uygulamak planlanıyor. Ben size sorudan aradıklarını oldukça net değilim

.... sen biraz netleştirebilirsiniz ?? Ne yapmaya çalışıyorsun? Nerede belada koşuyorsun?

+0

Marc, Tek bir dersi miras aldığımız gibi, Arabirim ile birden fazla kalıtımda tam davranışı nasıl bulabileceğimizi bilmek istiyorum. Geçerli nesneyi, Arabirim kullanımıyla başka bir sınıfa yazabilir miyiz? (Bu MH olarak adlandırılabilir) – nunu

+7

** gerçek çoklu miras ile yapacağınız gibi aynı arayüzleri uygulayamazsınız. Arayüzler sadece fonksiyonel bir arayüz tanımlar - birden fazla uygulamadan miras kalmazsınız. Bu bir yaklaşımdır - kesin bir ikame değil. –

+1

"katı çoklu kalıtım" mevcut değil, ancak bazı fikir birliği "katı" çoklu uygulama kalıtımı anlamına gelir. Geldiğinde, * çoklu arabirim kalıtımı *, birçok formun var olduğu birden fazla kalıtsal bir başka formdur (Meyer, OOSC'de 16 bu tür formu p824 +). – Abel

2
class MyClass : IFirstInterface, ISecondInterface, IThirdInterface 
{ 
    // implement the methods of the interfaces 
} 
7

DEĞİL çoklu miras yerine geçer. Arayüzler, bir sınıfın yapacağı sözleşmeyi belirtmek için vardır. Daha soyut sınıflar gibi.

Birden fazla kalıtımın etkilerini elde etmek istiyorsanız, Composite Pattern'u uygulamak size yardımcı olabilir.

class EmptyClass : IDoSomething, IDoSomethingElse 
{ 
} 
interface IDoSomething 
{ 
} 
interface IDoSomethingElse 
{ 
} 

static class InterfaceExtensions 
{ 
    public static int DoSomething(this IDoSomething tThis) 
    { 
     return 8; 
    } 
    public static int DoSomethingElse(this IDoSomethingElse tThis) 
    { 
     return 4; 
    } 
} 

daha adil üzerinde arayüzleri teyel daha çoklu miras gibi bir şey olabilir arabirimde uzantısı yöntemleri kullanma:

1

O zaman bu birden fazla arayüzden miras yoktur. Yöntemler arayüz tanımının bir parçası olmadığından, bunları istemedikçe bunları sınıfta uygulamak zorunda değilsiniz. (Gerçekten onları geçersiz kılmaz, daha spesifik veya tam tip adı, daha sonra gelen türleri üzerinde kazanır, çünkü onları aramak için bir tür EmptyClass başvuru gerekir.

İlgili konular