2013-07-29 22 views
12

Basit bir soru # var (bu yüzden inanıyorum). Ben dil ile yeni başlayan biriyim ve bunları uygulayan arayüzler ve sınıflarla ilgili bir problem yaşadım. SorunArabirimde olmayan sınıf yöntemi

Ben Arayüz arabirimini uygulamak iA

interface iA 
{ 
    bool method1 
    bool method2 
    bool method3 
} 

ve 3 sınıflar var: class B, C ve D

class B : iA 
{ 
    public bool method1 
    public bool method2 
    public bool method3 
} 

B sınıfı bulunmayan başka bir yöntemi olsaydı Arabirim, method4() diyelim ve aşağıdakilere sahibim:

iA element = new B(); 

ve sonra kullanmak:

element.method4(); 

ben tip iA birinci argüman alır method4() yok belirten bir hata olacaktı.

Sorun şu: Bir arabirim nesnesine sahip olabilir ve bir sınıfla örneklenebilir ve bu nesnenin sınıfta bir arabirimi, arabirimde olmayan bir yöntemi çağırabilir miyim?

Geldiğim bir çözüm, arabirim ile türetilmiş sınıflar arasında soyut bir sınıf kullanmak, ancak arabirimi kapsam dışı bırakacak IMO kullanmaktı. Tasarımımda sadece arayüzü ve türetilmiş sınıfları kullanmak istiyorum.

+1

'if (öğe tür (B) 'dir) ((B) öğesi) .method4();' bu yardımcı olmalıdır – wudzik

+5

Temiz ve iyi biçimlendirilmiş bir soru soran yeni ve yeni bir kullanıcı. Bu nadir, tebrikler ve hoş geldiniz. :) – Otiel

+0

İyi soru. +1 Gerçek senaryoyu verirseniz, en iyi tasarım yaklaşımını öneriyoruz. –

cevap

2

Arabirim tipini sınıf tipine çevirmeniz gerekir; Genellikle biz olarak vasıtasıyla bunu:

B b = element as B; // <- try cast element as B 

    if (!Object.RefernceEquals(null, b)) { // <- element is B or can be legaly interpreted as B 
    b.method4(); 
    } 

avantajı "dır" ve (B) iki atmalarını yapmak varken, tek dağıtım işlemi olduğu yönünde "olarak".

4

Evet, bu mümkün. Sadece böyle sınıf türüne Arayüz türü döküm gerekir: Yapabileceğin döküm olmadan

if(element is B) 
{ 
    ((B)element).method4(); 
} 
+2

Yan nota: Eğer elemanın 'B' – wudzik

+0

olduğundan emin olmak için' if (eleman typeeof (B) ') 'i ekleyebilirsiniz. Bunu muhtemelen yapmak istemiyor musunuz? –

+0

Bu iyi bir nokta. Bunu cevabıma ekleyeceğim. –

2

: elemnt doğru tipte ise

wudzik önerdiği gibi
iA element = new B(); 
((B)element).method4(); 

, sen kontrol etmelisiniz bu.

interface iA 
{ 
    bool method1(); 
    bool method2(); 
    bool method3(); 
} 

interface IFoo : iA 
{ 
    bool method4(); 
} 

class B : IFoo 
{ 
    public bool method1() {} 
    public bool method2() {} 
    public bool method3() {} 
    public bool method4() {} 
} 

IFoo element = new B();  
element.method4(); 

Not: C# arayüzleri için sermaye I öneki kullanmaya çalışın.

+0

Bu, yazım denetimini ve döküm işlemini önler, ancak şimdi farklı bir nesneniz var IFoo. Kullanıcı bir iA nesnesine sahipse, o nesneyi method4'ü çalıştırabilmek için hala bir IFoo olup olmadığını kontrol etme ihtiyacı vardır. –

+1

Evet, ancak tasarım açısından, bu tür arayüzlere karşı beton türlerine karşı çalışmak daha akıllıdır. Çeşitli arayüzleri uygulayan türleri genişletmenin artık daha kolay olduğu için daha iyi ölçeklendiren bir çözümdür. –

İlgili konular