Nie można zastąpić typu właściwości. Zapoznaj się z następującym kodem:
StrBase s = new StrBase();
Base b = s;
To jest całkowicie poprawny kod. Ale co się dzieje, gdy próbujesz to zrobić?
b.prop = 5;
Liczba całkowita może być przekształcany do object
, ponieważ wszystko pochodzi z object
. Ale ponieważ b
jest w rzeczywistości instancją StrBase
, musiałby w jakiś sposób przekonwertować wartość całkowitą na ciąg znaków, którego nie może. Dlatego właśnie nie wolno ci nadpisywać tego typu.
Ta sama zasada odnosi się do leków generycznych:
List<BaseG<object>> l = new List<BaseG<object>>();
BaseG<string> s = new BaseG<string>();
// The compiler will not allow this.
l.add(s);
// Here's the same problem, convert integer to string?
BaseG<object> o = l[0];
o.prop = 5;
To dlatego typy rodzajowe w C# 2.0 są niezmienne. C# 4.0 pozwala na ten typ konwersji, zwany kowariancją i kontrawariancją.
Solutions
Opcja jest do oddania object
powrotem do łańcucha, kiedy jest to potrzebne. Można dodać walidację typu na podklasy:
public class StrBase : Base
{
private string propValue;
public override object prop {
get
{
return this.propValue;
}
set
{
if (value is string)
{
this.propValue = (string)value;
}
}
}
}
można również narazić właściwość type-safe w podklasie:
public class StrBase : Base
{
public string strProp {
get
{
return (string)this.prop;
}
set
{
this.prop = value;
}
}
}
+1: To jest czyste rozwiązanie problemu. Oddziel klasę podstawową od części ogólnej. –