Covariant problem
Koroskin Denis
2korden at gmail.com
Wed Jul 23 10:46:23 PDT 2008
On Wed, 23 Jul 2008 21:37:22 +0400, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> "Lars Ivar Igesund" wrote
>> Steven Schveighoffer wrote:
>>
>>> "Zarathustra" wrote
>>>> error:
>>>> function basis.CPolygon2d.getPoints of type CPoint2d[]() overrides but
>>>> is
>>>> not covariant with basis.CPolygon3d.getPoints of type CPoint3d[]()
>>>>
>>>> I don't know how to fix this problem. What does 'covariant' mean?
>>>
>>> Covariant means that the override returns something that can be
>>> implicitly
>>> casted to the base version.
>>>
>>> So the error looks like the base class function getPoints returns type
>>> CPoint3d[], but the derived class is returning CPoint2d[]. In order
>>> for
>>> this to work, CPoint2d[] must be implicitly castable to CPoint3d[],
>>> which
>>> probably isn't true.
>>>
>>> In order to diagnose the problem exactly, we would have to see code.
>>> At
>>> least the class hierarchy.
>>>
>>> -Steve
>>
>> Arrays are not implicitly castable (not even explicitly afaik) to
>> another
>> type, no matter how they are related.
>
> From http://www.digitalmars.com/d/1.0/arrays.html
>
> A dynamic array T[] can be implicitly converted to one of the following:
>
> a.. U[]
> b.. void[]
> Where U is a base class of T.
>
> -Steve
>
>
It should be castable to *const(U)[]* but not to U[], it's a bug otherwise:
class U
{
}
class T : U
{
void foo() {}
}
void main() {
T[] t = new T[42];
U[] u = t;
u[0] = new U;
t[0].foo(); // access violation
}
const(U)[] would prevent that.
More information about the Digitalmars-d-learn
mailing list