2011-07-11 16 views
6

Tôi có một loại từ điển đặc biệt. Tôi không chắc chắn làm thế nào để làm điều này chính xác, nhưng tôi đang tìm cách để làm cho phương pháp có được ảo, nhưng không phải là phương pháp thiết lập:C# Chỉ mục thuộc tính - Bất kỳ cách nào để ảo hóa phương thức nhận và không phải là phương thức đã đặt?

public TValue this[TKey key] 
    { 
     get { ... } 
     set { ... } 
    } 

Có thể và nếu như vậy kết hợp chính xác là gì?

+0

những gì bạn muốn đạt được bằng cách chỉ làm cho bộ thu «ảo'? Có thể có cách tốt hơn để làm điều đó. –

+0

Chỉ cố gắng làm cho nó có thể mở rộng "ReadOnlyDictionary" của tôi. Bởi vì nó là một từ điển chỉ đọc, tôi không hỗ trợ phương thức set (ném một ngoại lệ), nhưng một lớp mở rộng có thể muốn thực hiện công việc bổ sung từ phương thức get, do đó chúng có thể ghi đè lên nó và sửa đổi nó. –

+0

Hơn bạn không nên cố gắng làm cho phương thức "get" ảo, mà thay vào đó có một số phương thức "OnGetCalled" ảo và cho phép lớp dẫn xuất ghi đè lên nó. Lớp có nguồn gốc sẽ không thể ghi đè "get" (tức là theo gợi ý của Mark) mà không cần gọi phiên bản Base, vì vậy phương thức riêng biệt sẽ làm cho hợp đồng rõ ràng. –

Trả lời

12

Bạn không thể làm điều đó trực tiếp - bạn sẽ cần phải thêm một phương pháp riêng biệt:

protected virtual TValue GetValue(TKey key) { ...} 

public TValue this[TKey key] 
{ 
    get { return GetValue(key); } 
    set { ... } 
} 
+1

+1 để đánh bại tôi trong 10 giây –

+0

Không sao, lỗi của tôi. Lấy làm tiếc. Các giải pháp tôi đã có trong tâm trí rõ ràng đã làm cho setter tư nhân. Tuy nhiên, nếu bộ sưu tập là chỉ đọc tôi không thấy vấn đề trong đó mà là một giải pháp khác. – InBetween

6

Xin lỗi ... Không có cú pháp để làm điều này trong C#, nhưng bạn có thể làm điều này thay vì .

public TValue this[TKey key] 
{ 
    get { return GetValue(key) } 
    set { ... } 
} 

protected virtual TValue GetValue(TKey key) 
{ 
    ... 
} 
0

Tôi giả định những gì bạn đang cố gắng làm ở đây là tạo ra tình huống mà họ phải xác định cách đọc thuộc tính chứ không phải cách thuộc tính được đặt?

Điều này đánh tôi như một ý tưởng tồi. Bạn có thể có một thiết lập thiết lập giá trị của _myVar nhưng cuối cùng nhà phát triển xây dựng một getter mà đọc _someOtherVar. Điều đó nói rằng, tôi không biết trường hợp sử dụng của bạn là gì, vì vậy rất có thể tôi đang thiếu thứ gì đó.

Bất kể, tôi nghĩ rằng câu hỏi trước khi điều này có thể giúp: Why is it impossible to override a getter-only property and add a setter?

1

tôi có thể hiểu lầm gì đó nhưng nếu bạn Dictionary sẽ là readonly bạn phải thực hiện một wrapper để đảm bảo nó thực sự readony (của từ điển tài sản được lập chỉ mục không phải là ảo nên bạn không thể thay đổi hành vi của nó) trong trường hợp này bạn có thể làm như sau:

public class ReadOnlyDictionary<TKey, TValue> 
{ 
    Dictionary<TKey, TValue> innerDictionary; 

    public virtual TValue this[TKey key] 
    { 
     get 
     { 
      return innerDictionary[key]; 
     } 
     private set 
     { 
      innerDictionary[key] = value; 
     } 
    } 
}