Re: query interface

2009-01-21 Thread Qian Xu
Qian Xu wrote:

 Hi All,
 
 can D check, whether a class A an Interface B supports?
 
 like:
 
   if (supports(class_A, intf_B))
   {
  cast(intf_B) (class_A).hello();
   }
 
 --Qian

what I have found is:

  if (is(class_A == intf_B))
  {
cast(intf_B) (class_A).hello();
  }

Is there any better one?

--Qian


Re: query interface

2009-01-21 Thread Frits van Bommel

Qian Xu wrote:

Hi All,

can D check, whether a class A an Interface B supports?

like:

  if (supports(class_A, intf_B))


if (is(class_A : intf_B))
tests if 'class_A' is implicitly convertible to 'intf_B'. If the first 
is a class and the second an interface, that's equivalent to the class 
implementing the interface.


Re: query interface

2009-01-21 Thread Jarrett Billingsley
On Wed, Jan 21, 2009 at 10:30 AM, Qian Xu quian...@stud.tu-ilmenau.de wrote:
 Hi All,

 can D check, whether a class A an Interface B supports?

 like:

  if (supports(class_A, intf_B))
  {
 cast(intf_B) (class_A).hello();
  }

At compile time, like Frits said, you can use is(class_A : intf_B).

At runtime, you can use cast(intf_B)someInstance.  That returns 'null'
if someInstance does _not_ inherit from intf_B.

if(auto i = cast(intf_B)instanceOfA)
i.hello();


Re: query interface

2009-01-21 Thread Qian Xu
Frits van Bommel wrote:

 Qian Xu wrote:
 Hi All,
 
 can D check, whether a class A an Interface B supports?
 
 like:
 
   if (supports(class_A, intf_B))
 
  if (is(class_A : intf_B))
 tests if 'class_A' is implicitly convertible to 'intf_B'. If the first
 is a class and the second an interface, that's equivalent to the class
 implementing the interface.

Thanks. Could you tell me, how to make a function for this? I do not know
how to pass an Interface as parameter.

like
  bool supports(T)(T obj, interface_type t)
  {
return (is(obj : t));
  }


Re: query interface

2009-01-21 Thread Trass3r

Qian Xu schrieb:

Thanks. Could you tell me, how to make a function for this? I do not know
how to pass an Interface as parameter.

like
  bool supports(T)(T obj, interface_type t)
  {
return (is(obj : t));
  }


Guess something like

bool supports(T, I) (T obj)
{
return (is(obj : I));
}

should do it.


Re: query interface

2009-01-21 Thread BCS

Reply to Qian,


Frits van Bommel wrote:


Qian Xu wrote:


Hi All,

can D check, whether a class A an Interface B supports?

like:

if (supports(class_A, intf_B))


if (is(class_A : intf_B))
tests if 'class_A' is implicitly convertible to 'intf_B'. If the
first
is a class and the second an interface, that's equivalent to the
class
implementing the interface.

Thanks. Could you tell me, how to make a function for this? I do not
know how to pass an Interface as parameter.

like
bool supports(T)(T obj, interface_type t)
{
return (is(obj : t));
}


Given 


interface I {}
class C1 {}
class C2 : C1, I {}
class C3 : C1 {}


if you want to check if an instance of C1 is a derived class that implements 
I use this



null !is cast(I)c1


if you want it in a function


bool IsA(TI, TC)(TC c)
{
  return null !is cast(TI)c;
}