digitalmars.D.learn - Mixins are not inherited?
- Namespace (45/45) May 03 2012 By the following code i get these error messages:
- Jonathan M Davis (20/81) May 03 2012 Nothing you put in a base class is automatically in a derived class. If ...
- Namespace (16/16) May 03 2012 Very sad, i thougth that was possible.
By the following code i get these error messages:
----
Error: template RefTest.Ref.__unittest1.instanceof(T : Object,U : 
Object) cannot deduce template function from argument types 
!(A)(B)
Error: template RefTest.Ref.__unittest1.instanceof does not match 
any function template declaration
	
Error: template instance instanceof!(A) errors instantiating 
template	
----
How is this possible? I thougth that the mixin would be inherited 
and so every subclass would be implicit cast to his super type. 
Isn't that so?
If i write "mixin TRef!(B);" in class B, it works fine. Can 
anyone explain me why do i have to write it in class B?
[code]
unittest {
	bool instanceof(T : Object, U : Object)(const Ref!U obj) {
		const U o = obj.access;
		return const_cast(o).toString() == typeid(T).toString();
	}
	class A {
		mixin TRef!(A);
	}
	class B : A {
		//mixin TRef!(B);
	}
	class C : B {
		//mixin TRef!(C);
	}
	A a1 = new B();
	A a2 = new C();
	assert(instanceof!(A)(a1) == false);
	assert(instanceof!(B)(a1));
	assert(instanceof!(C)(a1) == false);
	writeln(a1);
	B b1 = cast(B) a1;
	assert(instanceof!(A)(b1) == false); // <-- fails
	writeln(b1);
	writeln();
}
[/code]
"TRef" is the same mixin template and "Ref" the same template 
struct as in my last threads.
 May 03 2012
On Thursday, May 03, 2012 23:32:50 Namespace wrote:
 By the following code i get these error messages:
 
 ----
 Error: template RefTest.Ref.__unittest1.instanceof(T : Object,U :
 Object) cannot deduce template function from argument types
 !(A)(B)
 
 Error: template RefTest.Ref.__unittest1.instanceof does not match
 any function template declaration
 
 Error: template instance instanceof!(A) errors instantiating
 template
 ----
 
 How is this possible? I thougth that the mixin would be inherited
 and so every subclass would be implicit cast to his super type.
 Isn't that so?
 If i write "mixin TRef!(B);" in class B, it works fine. Can
 anyone explain me why do i have to write it in class B?
 
 [code]
 unittest {
 bool instanceof(T : Object, U : Object)(const Ref!U obj) {
 const U o = obj.access;
 
 return const_cast(o).toString() == typeid(T).toString();
 }
 
 class A {
 mixin TRef!(A);
 }
 
 class B : A {
 //mixin TRef!(B);
 }
 
 class C : B {
 //mixin TRef!(C);
 }
 
 A a1 = new B();
 A a2 = new C();
 
 assert(instanceof!(A)(a1) == false);
 assert(instanceof!(B)(a1));
 assert(instanceof!(C)(a1) == false);
 
 writeln(a1);
 
 B b1 = cast(B) a1;
 
 assert(instanceof!(A)(b1) == false); // <-- fails
 
 writeln(b1);
 
 writeln();
 }
 [/code]
 
 "TRef" is the same mixin template and "Ref" the same template
 struct as in my last threads.
Nothing you put in a base class is automatically in a derived class. If you 
put a member variable or member function in a base class, it's not in the 
derived class. It's just that the derived class has access to it as long as 
it's protected or public.
In the case of a mixin, you're essentially copying and pasting code. So, it's 
in the base class similarly to if you typed it there yourself. However, 
templated functions aren't virtual, so unlike if you typed them yourself, they 
won't be virtual if you use a template mixin.
So, if you want to mixin something into every class in a hierarchy, you must 
mix it in to every class in the hierarchy, not just the base class.
And if you want to test whether an object is an instance of a specific class, 
then cast it and check whether the result is null. You don't need to create a 
function to figure it out for you. e.g.
auto c = cast(MyClass)object;
if(c is null)
 writeln("c is NOT an instance of MyClass");
else
 writeln("c IS an instance of MyClass");
- Jonathan M Davis
 May 03 2012
Very sad, i thougth that was possible.
As regards to "instanceof"
Try this code:
unittest {
	class A {
		mixin TRef!(typeof(this));
	}
	class B : A { }
	class C : B { }
	A a1 = new B();
	A a2 = new C();
	assert(instanceof!(A)(a1) == false);
	assert(instanceof!(B)(a1));
	assert(instanceof!(C)(a1) == false);
}
with my instanceof and then with your version.
 May 03 2012








 
  
  
  "Namespace" <rswhite4 googlemail.com>
 "Namespace" <rswhite4 googlemail.com>