Điều này không thể thực hiện được trong bất kỳ ngôn ngữ .NET nào vì những lo ngại về an toàn kiểu. Trong các ngôn ngữ kiểu an toàn, bạn phải cung cấp hiệp phương sai cho các giá trị trả về và đối xứng cho các tham số. Hãy mã này:
class B {
S Get();
Set(S);
}
class D : B {
T Get();
Set(T);
}
Đối với Get
phương pháp, hiệp phương sai có nghĩa là T
phải hoặc là S
hoặc một loại có nguồn gốc từ S
. Nếu không, nếu bạn có một tham chiếu đến một đối tượng kiểu D
được lưu trữ trong một biến được gõ B
, khi bạn gọi là B.Get()
bạn sẽ không nhận được một đối tượng đại diện như là một S
quay lại - phá vỡ hệ thống kiểu.
Đối với phương thức Set
, sự đối nghịch có nghĩa là T
phải là S
hoặc loại S
xuất phát từ đó. Nếu không, nếu bạn có tham chiếu đến đối tượng thuộc loại D
được lưu trữ trong một biến được nhập B
, khi bạn gọi là B.Set(X)
, trong đó X
là loại S
nhưng không thuộc loại T
, D::Set(T)
sẽ nhận được đối tượng thuộc loại không mong đợi. Trong C#, đã có quyết định không cho phép thay đổi loại khi quá tải thuộc tính, ngay cả khi chúng chỉ có một cặp getter/setter, vì nó sẽ có hành vi rất không nhất quán ("Ý của bạn là, tôi có thể thay đổi loại trên một với một getter, nhưng không phải với một getter và setter? Tại sao không?!? " - Anonymous Alternate Universe Newbie).
Nguồn
2008-10-01 11:59:46
Tất cả các giải pháp ngoại trừ giải pháp cho biết bạn không thể thực sự không giúp được tình huống. Tôi nghĩ rằng điểm là để có thể có một lớp học trẻ em (đúc như một người cha) và gọi SomeProperty và có trả lại một đứa trẻ mà không có một diễn viên.Tất nhiên tôi đoán tại mục đích thực sự như evryone khác :) – mattlant
Mặc dù không có giải pháp hoàn hảo tồn tại, ý tưởng là để tìm ra cách rõ ràng nhất để thực hiện điều này, với những thứ ồn ào nhất, như phôi, kiểm tra các loại bằng cách sử dụng "là" và vân vân. –
Mặc dù bạn không thể làm điều này trong C#, tôi đã viết một loạt các bài đăng trên blog về cách thực hiện chính xác điều này: http://www.simple-talk.com/community/blogs/simonc/archive/2010/07/14 /93495.aspx – thecoop