2015-12-16 14 views
6

Tôi có hai lớp.hai lớp với các phương pháp và đặc tính chung

Class A:

class A() { 
    public void QQ() {} 
    public void WW() {} 
} 

Và Class B:

class B() { 
    public void QQ() {} 
    public void WW() {} 
} 

Họ không chia sẻ cùng một giao diện hoặc lớp trừu tượng. A và B có hai hình chữ nhật riêng biệt và tôi không thể thay đổi điều đó vào lúc này.

Tôi muốn viết một thủ tục duy nhất hoạt động cho A và B và sử dụng phương pháp QQ và WW.

Tôi có thể làm điều đó không? Bạn có thể đề xuất bất kỳ tài liệu nào tôi có thể học không?

Tanks

+4

bạn có thể sử dụng đại biểu –

+0

nó rất giống với kiểu động – Admdebian

+0

"Họ không chia sẻ cùng một giao diện" - có, hiện tại không có 'giao diện' mà cả hai đều triển khai. Tuy nhiên, họ rõ ràng có một số phần của bề mặt chung của họ. Vì vậy, xác định một giao diện 'ICanQQAndWW', và có cả hai thực hiện nó. Tại sao tìm kiếm một hack xấu xí khi đã có một cách rõ ràng rõ ràng để làm điều đó? – AakashM

Trả lời

8

Điều này được gọi là Duck Typing.

Bạn có thể sử dụng động

void Foo(dynamic dy) 
{ 
    dy.QQ(); 
} 

Bạn cũng có thể sử dụng phản ánh. (reference)

public static void CallQQ(object o) 
{ 
    var qq = o.GetType().GetMethod("QQ"); 
    if (qq != null) 
     qq.Invoke(o, new object[] { }); 
    else 
     throw new InvalidOperationException("method not found"); 
} 
+1

Điều này bỏ qua thực tế rằng đối tượng dy có thể không có một phương pháp QQ, mà sẽ gây ra một lỗi thời gian chạy. – Domysee

+0

@ Domysee Tôi nghĩ điều này tốt hơn là che giấu sự thật đó trong cách tiếp cận của bạn –

+0

@IvanStoev ý của bạn là gì? Luôn có khả năng ném ngoại lệ nếu không có loại nào được áp dụng. – Domysee

4

Bạn có thể kiểm tra nếu đối tượng là các loại hình cụ thể, sau đó quăng nó và gọi phương thức của nó:

void InvokeQQ(object o){ 
    if(o is A) 
     (o as A).QQ(); 
    if(o is B) 
     (o as B).QQ(); 
} 

Trong C# 6 bạn có thể đơn giản hóa này để

void InvokeQQ(object o){ 
    (o as A)?.QQ(); 
    (o as B)?.QQ(); 
} 
+1

Đây không phải là một phương pháp duy nhất. Đây là sự kết hợp của hai phương pháp. Bạn có thể kết hợp tất cả các phương thức trên thế giới vào một phương thức bằng cách sử dụng phương pháp này. – dotctor

+3

trong C# 6 nó có thể được đơn giản hóa để '(o như A) ?. QQ(); ' –

+0

@ M.kazemAkhgary Cảm ơn, tôi đã cập nhật câu trả lời. – Domysee

-1

Cant bạn chỉ cần thực hiện một tầng lớp phụ huynh và đưa những phương pháp trong đó và sau đó cho phép A và B kế thừa từ lớp đó?

+1

* "A và B có hai hình chữ nhật riêng biệt và tôi không thể thay đổi điều đó vào lúc này." * – Domysee

+0

bạn có thể giải thích câu hỏi của mình chi tiết hơn một chút không? giống như bạn muốn cả hai phương pháp này được gọi cùng một lúc từ một phương thức nhất định trong Chính hay ở đâu đó? –

+0

Tôi có 2 lớp với các phương thức bằng nhau. Đầu tiên là một lớp sản xuất và lớp thứ hai là lớp môi trường thử nghiệm. Tôi vô lý biết. Tôi phải viết mã hoạt động cả trong sản xuất và trong môi trường thử nghiệm và tôi phải sử dụng các lớp đó. – Admdebian

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