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