Cách duy nhất tôi có thể nghĩ đến là bóng bất động sản với một hình mới:
public class DerivedClass : BaseClass
{
int intValue;
public new int MyProperty
{
get { return intValue; }
set { intValue = value; }
}
}
Thông báo như thế nào tài sản được khai báo new
thay vì override
. Điều này có nghĩa là, tất nhiên, MyProperty
của loại DerivedClass
không có gì để làm với MyProperty
loại BaseClass
, đó là một thuộc tính hoàn toàn mới có cùng tên (do đó ẩn một tên khỏi lớp cơ sở).
Kết quả là thế này:
DerivedClass d = new DerivedClass();
d.MyProperty = 42;
BaseClass b = new DerivedClass();
b.MyProperty = 42; /* compilation error: Property or indexer
'TheNamespace.BaseClass.MyProperty'
cannot be assigned to -- it is
read only */
Ngoài ra, như bang @silky trong các bình luận:
(mặc dù tôi đề nghị bạn thực hiện nó, và phụ huynh, tham khảo các biến tương tự để tránh một tình huống rất khó hiểu) nhưng Tôi thực sự không nghĩ rằng điều này sẽ bao giờ là thích hợp.
... bạn có thể muốn có thuộc tính mới truy cập thuộc tính từ lớp cơ sở (thông qua base.MyProperty
, hoàn tất bằng trình bảo vệ được thiết lập). Hãy xem xét những điều sau ví dụ:
DerivedClass d = new DerivedClass();
d.MyProperty = 42;
BaseClass b = d;
Console.WriteLine(b.MyProperty); // prints 1
Điều đó nói rằng, tôi luôn luôn cảm thấy một chút bẩn khi sử dụng new
(trong đó, khi tôi nghĩ về nó, tôi không chắc chắn rằng tôi đã thực sự thực hiện trong mã sản xuất).
Cập nhật
Với kịch bản ví dụ mà bạn đưa ra (mà tôi giải thích theo một cách mà một Parent
là để có thể thiết lập các RestrictionLevel
của một Child
), nó có thể được giải quyết như thế này:
public enum RestrictionLevel
{
Low,
Medium,
Grounded
}
public class Person
{
public RestrictionLevel RestrictionLevel { get; private set; }
protected static void SetRestrictionLevelInternal(Person person, RestrictionLevel restrictionLevel)
{
person.RestrictionLevel = restrictionLevel;
}
}
public class Child : Person { }
public class Parent : Person
{
public void SetRestrictionLevel(Child child, RestrictionLevel restrictionLevel)
{
SetRestrictionLevelInternal(child, restrictionLevel);
}
}
Điều này có nghĩa rằng đoạn mã sau là hợp lệ:
Child c = new Child();
Parent p = new Parent();
p.SetRestrictionLevel(c, RestrictionLevel.Grounded);
...nhưng điều này không phải là:
Child c = new Child();
c.SetRestrictionLevel(c, RestrictionLevel.Low);
Phương pháp SetRestrictionLevelInternal
thể được gọi từ trong bất kỳ loại hậu duệ (bao gồm Child
), nhưng không thể được gọi từ bên ngoài kiểu riêng của mình. Vì vậy, bạn không thể gọi SetRestrictionLevelInternal
trên phiên bản Parent
. Trong ví dụ trên, chúng tôi chọn hiển thị phương thức public
, lần lượt gọi phương thức protected
.
Liên kết chéo: http://stackoverflow.com/questions/1489361/override-abstract-readonly-property-to-read-write-property – Mikhail
Chỉ cần thiết để ngăn chặn việc đọc chỉ đọc đối tượng đang được cập nhật gián tiếp . Cảm ơn bạn đã đặt câu hỏi trước khi tôi cần câu trả lời. –