2013-01-02 49 views
7

đây là một cái gì đó thực sự đơn giản Im chắc chắn, nhưng Im đấu tranh để có được đầu của tôi xung quanh malarky thừa kế khi nói đến interfacing.Phương pháp chung C# với thừa kế và giao diện

Với các lớp sau, làm cách nào để tôi giao diện phương thức Get trong giao diện dành riêng cho lớp cha mẹ, mà không ghi đè phương thức cơ sở?

public class Base<T, T2> 
{ 
    public T Get<T, T2>(string key) 
    { 
     ... 
    } 
} 

public class Parent : Base<Type1, Type2>, IParent 
{ 
    ... 
} 

Đây là những gì tôi có, nhưng tôi vẫn nhận được lỗi "thành viên Inteface Type1 IParent.Get (string) không được triển khai".

public interface IParent 
{ 
    Type1 Get(string key); 
} 
+1

Bạn không cần 'Nhận ' trong phương thức nếu chúng đã được khai báo trong lớp. – ja72

+0

Cảm ơn tất cả các ý kiến, nó đã giúp tôi hiểu nó tốt hơn nhiều.ja72, Krizz, Charles & Guvante đều đánh trúng đinh trên đầu, nhưng mô tả của Charles là sâu nhất (với các ví dụ mã, không ít hơn) nên anh ta nhận được dấu màu xanh lá cây :) – beterthanlife

Trả lời

2

Phương pháp T Get<T,T2>(string) của Base<T,T2> và phương pháp Type1 Get(string) phương pháp IParent là hai chữ ký phương thức khác nhau. Bạn sẽ cần phải thực hiện cả hai. Nếu bạn muốn cả hai hiện thực để sử dụng các chức năng tương tự bạn có thể làm như sau:

public class ParentJ : Base<Type1, Type2>, IParent { 
public Type1 Get(string key) { 
    return this.Get<Type1,Type2>(key); 
} 
} 

Tuy nhiên tôi tin rằng ý định ban đầu của bạn không phải là để parameterize phương pháp Get() trong Base<T,T2> do đó bạn sẽ viết Base như vậy:

public class Base<T,T2> { 
    public T Get(string key) { 
    // implementation here 
    } 
} 

Chữ ký đó sẽ đáp ứng chữ ký phương thức trong IParent.

Bạn chỉ cần tham số loại (ví dụ: TT2) trên các phương thức khi loại không thể hoặc không được suy ra bởi lớp chứa phương thức.

5

public T Get<T, T2>(string key) sẽ tạo phương pháp chung chung trên lớp chung. TT2 sẽ là đối số của phương pháp chung chung này và sẽ không có liên quan đến số TT2 của lớp học.

Chỉ cần đặt số public T Get(string key).

2

Khi phương thức đối sánh, chữ ký này phải khớp chính xác. Một trong các thành phần của chữ ký là số đối số chung.

Giao diện IParent của bạn chứa phương thức Get với đối số loại 0. Lớp Base của bạn chứa phương thức Get với hai đối số loại.

Trong khi có vẻ như Base.Get chia sẻ các đối số kiểu của nó, nó không, cú pháp được sử dụng tạo hai đối số kiểu mới để tô bóng đối số kiểu của lớp.

Việc khắc phục chỉ đơn giản là thực hiện phương thức Get trong Parent không có bất kỳ đối số loại nào.

1

Hãy thử điều này. Bạn không ghi đè lên cơ sở Get và bạn triển khai IParent.

public class Type1 { } 
public class Type2 { } 

public interface IParent 
{ 
    Type1 Get(string key); 
} 

public class Base<T, T2> 
{ 
    public T Get(string key) 
    { 
     return default(T); 
    } 
} 
public class Parent : Base<Type1, Type2>, IParent 
{ 
} 
0

thử bằng cách sử dụng giao diện IPar chung.

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