c# - Hide an Object's Type from Compiler -


i asked question in interview. caught me off guard.

you have super class , subclass. class b subclass of a. both classes have implementation of same function foo().

is possible write piece of code makes compiler doesn't know type of object is? in case object b below.

a b = new b(); 

then function call in type won't known until execution.

this answer on whiteboard: (a)b.foo();

in c# use dynamic keyword achieve dynamic typing.

public void mymethod(dynamic myvar)  {     // compiler don't know exact type of myvar     // myvar have foo() method? if not, runtime error.     myvar.foo();   } 

however, don't think answer looking since a , b mentioned (and should apply both java , c#).

what might have been looking (and saying yourself) this:

public void mymethod(a a) {     a.foo();    // foo() method called? 1 or 1 b? } 

you can use instances of a , b parameter mymethod, because b have is-a relationship (it inherits) a. compiler sees a instance of a though might instance of b.

what foo() method called? depends on whether b overrides a's implementation of foo() or hides it. if hides a's method called , determined @ compile time , doesn't matter type a have.

if overrides foo() (which case) determined @ runtime. since compiler doesn't know exact type of a, correct method call looked @ runtime based on runtime type of a.

so compiler do know type (it is-an a), not know exact type (is subclass or not?).


as side note. (a)b.foo(); cast value returned foo() a. if want cast b a before calling foo() should add set of parentheses: ((a)b).foo();. however, cast unnecessary, since b declared a variable (a b = ..).


Comments

Popular posts from this blog

how to proxy from https to http with lighttpd -

android - Automated my builds -

python - Flask migration error -