check type
Adam Burton
adz21c at gmail.com
Sat Nov 6 11:05:37 PDT 2010
spir wrote:
> Hello,
>
>
> What is the common idiom to check whether the type of a given element is
> what I expect? Seems that
> typeof(e) == Type
> is refused by the compiler, for any reason? I get
> DeeMatch.d(237): Error: type string is not an expression
> I'm using
> typeof(e).stringof == "TypeName"
> Is there a better solution?
>
> Also, how to override a class's field so that it is accessed according
> actual/runtime type? (Like method dispatch.) void method (SuperType x)
> {...access x.f...} If I don't define f in SuperType, then I get a compiler
> error. If I do, then SuperType.f is accessed, not the field on actual
> class of x.
>
>
> Denis
> -- -- -- -- -- -- --
> vit esse estrany ☣
>
> spir.wikidot.com
1.
I believe typeof(e) will give you the type of "e" not the type of the object
e is pointing too. So for example
class A {}
class B : A {}
A a = new A();
B b = new B();
A a2 = new B();
typeof(a).stringof // A
typeof(b).stringof // B
typeof(a2).stringof // A
I think there are methods in the Object class that gives you the name of the
runtime type, but I have never checked.
2.
When referencing SuperType you can only access the public members of
SuperType (and its super/base types). In order to access the dervied class's
members you need to reference it as the Derived. For example.
class A { void a() {} }
class B : A { void b() {} }
class C : A { void c() {} }
A d = new B();
d.a();
d.b(); // compile fail
(cast(B) d).b();
(cast(C) d).c(); // fails at runtime
I think as a rule the above is considered bad practice. If f does not exist
in SuperType then you shouldn't be passing the function SuperType, you
should be passing whatever type it is you are expecting that has f defined
in it. The casts above get round it, but as I say, generally considered bad
practice.
More information about the Digitalmars-d-learn
mailing list