2013-02-25 18 views
5

Mam wątpliwości, w jaki sposób wywołać metodę konkretnego interfejsu (Powiedz IA lub IB lub In ...) w poniższym kodzie. Proszę, pomóż mi, jak zadzwonić. Skomentowałem linie kodu, w których deklaruję metody interfejsu "publiczne", w którym to przypadku działa. Nie wiem, jak to nazwać, kiedy jawnie zadeklarować :(uczę się C# ....Jak wywołać konkretną jawnie deklarowaną metodę interfejsu w C#

interface IA 
    { 
     void Display(); 
    } 
    interface IB 
    { 
     void Display(); 
    } 
    class Model : IA, IB 
    { 
     void IA.Display() 
     { 
      Console.WriteLine("I am from A"); 
     } 
     void IB.Display() 
     { 
      Console.WriteLine("I am from B"); 
     } 
     //public void Display() 
     //{ 
     // Console.WriteLine("I am from the class method"); 
     //} 

     static void Main() 
     { 
      Model m = new Model(); 
      //m.Display(); 
      Console.ReadLine(); 
     } 
    } 
+0

Czytałaś docs? Próbowałeś czegoś samemu? Jakie problemy napotkaliście podczas tego? – wRAR

+0

Cześć wRAR, Próbowałem wywołać Display, gdy deklarowałem niejawnie. Ale tak, nigdy nie próbowałem, ponieważ nie miałem pojęcia, jak to nazwać, gdy chcę jawnie nazwać metodę interfejsu ... Teraz poznałem poprzez pomoc poniżej :) Pozdrawiam – Learner

+0

Nie odpowiedziałeś, czy przeczytałeś dokumenty na ten temat. Mają odpowiedź i zawierają przykłady. – wRAR

Odpowiedz

9

Aby wywołać wyraźną metodę interfejsu, należy użyć zmiennej odpowiedniego typu, lub bezpośrednio rzutować na że interfejs:

static void Main() 
    { 
     Model m = new Model(); 

     // Set to IA 
     IA asIA = m; 
     asIA.Display(); 

     // Or use cast inline 
     ((IB)m).Display(); 

     Console.ReadLine(); 
    } 
+1

Być może (m jak IB) .Display() byłby bardziej czytelny, +1 chociaż – BlackBear

+0

Cześć Reed, dziękuję bardzo, to działa, ale szczerze mówiąc nie rozumiem co oznacza IA asIA = m. To jest zadanie? Chodzi mi o to, że nie rozumiem, jak to działa, czy mógłbyś wyjaśnić mi kilka podstawowych pojęć? Byłbym wdzięczny, że :) :) – Learner

+3

'(m jak IB) .Display()' nie jest lepszy, ponieważ niesie ze sobą niewłaściwą semantykę. Jeśli znasz 'x' typu" T ", zawsze używaj' (T) x'. 'x as T' oznacza, że' x' może być typu 'T', a następnie sprawdza, czy masz' null' czy nie. –

3

metoda, która zostanie wywołana w zależności od typu, który nazywa go. na przykład:.

Note, dla jasności, ja utworzyć dwie pozycje W praktyce jednak, don” t chcesz to zrobić, powinieneś po prostu rzucić obiekt pomiędzy typy:

static void Main(string[] args) 
{ 
    // easy to understand version: 
    IA a = new Model(); 
    IB b = new Model(); 

    a.Display(); 
    b.Display(); 

    // better practice version: 
    Model model = new Model(); 

    (IA)model.Display(); 
    (IB)model.Display(); 
} 

interface IA 
{ 
    void Display(); 
} 

interface IB 
{ 
    void Display(); 
} 

class Model : IA, IB 
{ 
    void IA.Display() 
    { 
     Debug.WriteLine("I am from A"); 
    } 

    void IB.Display() 
    { 
     Debug.WriteLine("I am from B"); 
    }    
} 

Wyjścia:

I am from A 
I am from B 
+0

Dziękuję bardzo Adam, to proste :) :) Pozdrawiam – Learner

+0

Ale Adam, czy to kosztowne zrobić raczej w ten sposób, niż metodę rzucania, jak to pokazują niektórzy przyjaciele powyżej? A ponieważ widzę, że używamy NOWEGO dwa razy ... ?? – Learner

+1

Stworzyłem dwie rzeczy tylko dla jasności, ale nie polecałbym tego w praktyce, sugerowałbym, żebyś podążył za odpowiedzią Reeda Copseya. Cieszę się, że to może ci pomóc zrozumieć! –

2

Trzeba użyć explicit interface implementation dla tego procesu.

Jeśli dwa elementy interfejsu nie wykonują taką samą funkcję, jednak może to prowadzić do błędnej realizacji jednego lub obu interfejsów. Możliwe jest implementowanie elementu interfejsu jawnie tworzącego członka klasy, który jest wywoływany tylko przez interfejs i jest specyficzny dla tego interfejsu. Jest to realizowane przez nazwanie członka klasy nazwą interfejsu i kropką.

interface IA 
{ 
    void Display(); 
} 
interface IB 
{ 
    void Display(); 
} 

    public class Program:IA,IB 
    { 

     void IA.Display() 
     { 
      Console.WriteLine("I am from A"); 
     } 

     void IB.Display() 
     { 
      Console.WriteLine("I am from B"); 
     } 

     public static void Main(string[] args) 
     { 
      IA p1 = new Program(); 
      p1.Display(); 
      IB p2 = new Program(); 
      p2.Display(); 
     } 
    } 

wyjściowe będą:

I am from A 
I am from B 

Oto DEMO.

+1

Bardzo dziękuję Soner za pomoc :) Doceniam to, okrzyki :) – Learner

+1

@Divine serdecznie witam ': D' –

2

W celu wywołania wyraźny sposób interfejsu musisz posiadać odniesienie do tego typu interfejsu lub oddania go:

IB ib = new Model(); 
ib.Display(); 

IA ia = (IA)ib; 
ia.Display(); 
+0

To doskonale działa dziękuję :):) Czy mogę wiedzieć, jaka jest różnica między IA ia = new Model() i IA ia = (IA) ib ??? Czy to się nazywa rzucanie jednego rodzaju do drugiego? – Learner

+1

@Divine Oznacza to, że ib, ponieważ Model implementuje IA może być CAST na IA, tak jak może być oddany z powrotem do Modelu. Jednak obiekt, który implementuje tylko IB, nie może być rzutowany na IA. Wszystkie odpowiedzi tutaj są bardzo podobne. – Bronumski

+0

dziękuję bardzo za pomoc i zrozumienie mnie :) Naprawdę to doceniam, okrzyki :) – Learner

Powiązane problemy