Thread overview
query interface
Jan 21, 2009
Qian Xu
Jan 21, 2009
Qian Xu
Jan 21, 2009
Frits van Bommel
Jan 21, 2009
Qian Xu
Jan 21, 2009
Trass3r
Jan 21, 2009
BCS
January 21, 2009
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
January 21, 2009
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
January 21, 2009
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.
January 21, 2009
On Wed, Jan 21, 2009 at 10:30 AM, Qian Xu <quian.xu@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();
January 21, 2009
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));
  }
January 21, 2009
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.
January 21, 2009
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;
> }