2010-03-16 26 views
7

Tôi có một lớp cơ sở "Cha mẹ" như thế này:Calling "Base-Getter" trong Overriding Getter Sở hữu

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Parent 
    { 
     private int parentVirtualInt = -1; 
     public virtual int VirtualProperty 
     { 
      get 
      { 
       return parentVirtualInt; 
      } 
      set 
      { 
       if(parentVirtualInt != value) 
       { 
        parentVirtualInt = value; 
       } 
      } 
     } 
    } 
} 

và một lớp trẻ như thế này:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Child : Parent 
    { 
     public override int VirtualProperty 
     { 
      get 
      { 
       if(base.VirtualProperty > 0) 
       { 
        throw new ApplicationException("Dummy Ex"); 
       } 
       return base.VirtualProperty; 
      } 
      set 
      { 
       if(base.VirtualProperty != value) 
       { 
        base.VirtualProperty = value; 
       } 
      } 
     } 
    } 
} 

Lưu ý rằng các getter trong Child đang kêu gọi getter của phụ huynh (hoặc ít nhất đây là những gì tôi có ý định).

Bây giờ tôi sử dụng lớp "Con" bằng cách khởi tạo nó, gán giá trị (giả sử 4) cho VirtualProperty của nó và sau đó đọc lại thuộc tính.

Child c = new Child(); 
c.VirtualProperty = 4; 
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty); 

Khi tôi chạy điều này, tôi rõ ràng nhận được một ApplicationException nói "Dummy Ex". Nhưng nếu tôi đặt một breakpoint trên dòng

if(base.VirtualProperty > 0) 

ở trẻ em và kiểm tra giá trị của base.VirtualProperty (bằng cách di chuột qua nó) trước khi ngoại lệ có thể được ném (tôi giả sử (d)), Tôi đã có ngoại lệ. Từ đây tôi chuyển tải rằng tuyên bố base.VirtualProperty trong "Chính cuộc gọi con của Getter"; loại.

Điều tôi muốn đạt được là hành vi giống như tôi nhận được khi tôi thay đổi định nghĩa parentVirutalInt (trong Cha mẹ) để bảo vệ và sử dụng base.parentVirtualInt trong Getter of Child thay vì base.VirtualProperty. Và tôi chưa thấy lý do tại sao điều này không hoạt động. Ai có thể làm sáng tỏ điều này không? Tôi cảm thấy rằng các thuộc tính bị ghi đè hoạt động khác với các phương thức ghi đè?

Nhân tiện: Tôi đang làm điều gì đó rất giống với phân lớp một lớp Tôi không có bất kỳ sự kiểm soát nào (đây là lý do chính tại sao "giải pháp thay thế" của tôi không phải là một tùy chọn).

Trân trọng

Trả lời

8

Đó là (được cho là) ​​một lỗi trong trình gỡ lỗi. Bạn có thể thêm phiếu bầu của mình vào số feedback article này. Đây không phải là dễ dàng để sửa chữa, tôi chắc chắn, trình gỡ lỗi không có quyền truy cập sẵn sàng đến địa chỉ phương thức getter thuộc tính cơ sở vì khe v-table cho bộ getter thuộc tính đã được thay thế trong lớp dẫn xuất.

Một cách giải quyết khác là lưu trữ giá trị cơ bản trong biến cục bộ trước để bạn có thể kiểm tra giá trị đó. Điều đó sẽ không làm cho getter của bạn chậm hơn.