2013-02-25 37 views
5

Tôi có nghi ngờ về cách gọi phương thức giao diện cụ thể (Nói IA hoặc IB hoặc Trong ...) trong mã sau đây. Xin hãy giúp tôi về cách gọi. Tôi đã nhận xét các dòng mã mà tôi khai báo các phương thức giao diện "public" trong trường hợp nó hoạt động. Tôi không biết làm thế nào để gọi nó khi tôi dứt khoát tuyên bố :(tôi đang học C# ....Cách gọi một phương thức giao diện được khai báo rõ ràng trong 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

Bạn có đọc các tài liệu? Bạn đã thử bất cứ điều gì cho mình? Bạn gặp phải vấn đề gì khi thực hiện việc này? – wRAR

+0

Xin chào wRAR, tôi đã cố gắng gọi Hiển thị khi tôi khai báo hoàn toàn. Nhưng có, tôi không bao giờ cố gắng như tôi đã không có đầu mối làm thế nào để gọi nó khi tôi muốn gọi một cách rõ ràng phương pháp giao diện ... Bây giờ tôi đến để biết thông qua sự giúp đỡ dưới đây :) Chúc mừng – Learner

+0

Bạn đã không trả lời cho dù bạn đã đọc tài liệu về chủ đề này. Họ có câu trả lời và chứa các ví dụ. – wRAR

Trả lời

9

Để gọi một phương pháp giao diện rõ ràng, bạn cần phải sử dụng một biến kiểu thích hợp, hoặc đúc trực tiếp đến giao diện mà:

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

Có lẽ (m như IB). Hiển thị() sẽ dễ đọc hơn, 1 mặc dù – BlackBear

+0

Hi Reed, cảm ơn bạn rất nhiều, nó hoạt động, nhưng thành thật mà nói tôi không hiểu IA nghĩa là gì = m. Nhiệm vụ của nó? Ý tôi là, tôi không hiểu nó hoạt động như thế nào, bạn có thể giải thích cho tôi về một số thuật ngữ cơ bản không? Tôi sẽ đánh giá cao điều đó :) :) – Learner

+3

'(m như IB). Hiển thị()' không tốt hơn vì nó mang ngữ nghĩa sai. Nếu bạn biết 'x' của kiểu' T' luôn luôn sử dụng '(T) x'. 'x như T' là trường hợp' x' có thể thuộc kiểu 'T' và bạn kiểm tra sau đó bằng cách kiểm tra nếu bạn có' null' hay không. –

3

phương pháp mà sẽ được gọi là phụ thuộc vào loại mà các cuộc gọi nó Ví dụ:..

Lưu ý, vì lợi ích của sự rõ ràng, tôi có thể tạo hai mặt hàng trên thực tế mặc dù, bạn don' Tôi muốn làm điều này, bạn chỉ nên bỏ đối tượng giữa các loại.

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"); 
    }    
} 

Đầu ra:

I am from A 
I am from B 
+0

Cảm ơn bạn rất nhiều Adam, thats simple :) :) Chúc mừng – Learner

+0

Nhưng Adam, nó có tốn kém để làm theo cách này chứ không phải là phương pháp đúc như được hiển thị bởi một số người bạn ở trên? Bởi vì tôi thấy chúng tôi sử dụng MỚI hai lần ... ?? – Learner

+1

Tôi đã tạo ra hai mục để chỉ rõ ràng, tôi sẽ không khuyên bạn nên làm điều đó trong thực tế mặc dù, tôi sẽ đề nghị bạn làm theo câu trả lời của Reed Copsey. Vui vì nó có thể giúp bạn hiểu mặc dù! –

2

Bạn cần phải sử dụng explicit interface implementation cho quá trình này.

Nếu hai thành viên giao diện không thực hiện các chức năng tương tự, Tuy nhiên, điều này có thể dẫn đến một thực hiện không chính xác của một hoặc cả hai của giao diện. Có thể triển khai thành viên giao diện một cách rõ ràng — tạo thành viên lớp chỉ được gọi thông qua giao diện và dành riêng cho giao diện đó. Điều này được thực hiện bằng cách đặt tên cho thành viên lớp học với tên giao diện và một khoảng thời gian.

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(); 
     } 
    } 

Output sẽ là:

I am from A 
I am from B 

Đây là một DEMO.

+1

Cảm ơn bạn rất nhiều Soner để được giúp đỡ :) Đánh giá cao, chúc mừng :) – Learner

+1

@Divine bạn đang khá hoan nghênh ': D' –

2

Để gọi một phương pháp giao diện rõ ràng bạn phải giữ một tham chiếu đến kiểu giao diện hoặc cast nó:

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

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

Thats hoàn toàn làm việc cảm ơn bạn :):) Tôi có thể biết sự khác biệt giữa IA ia = new Model() và IA ia = (IA) ib ??? Nó được gọi là đúc một loại khác? – Learner

+1

@Divine Nó có nghĩa là ib, bởi vì Mô hình triển khai IA có thể là CAST đến một IA giống như nó có thể được đưa trở lại Mô hình. Tuy nhiên, một đối tượng thực hiện chỉ IB không thể truyền sang IA. Tất cả các câu trả lời ở đây đều rất giống nhau. – Bronumski

+0

cảm ơn bạn rất nhiều vì sự giúp đỡ và làm cho tôi hiểu :) Tôi thực sự đánh giá cao nó, chúc mừng :) – Learner

Các vấn đề liên quan