I come from both a C++ and C# background. Those have been the
primary languages I have used. In C# you can do something like
this:
public interface ISomeInterface<T>
{
T Value { get; }
}
public class SomeClass<T> : ISomeInterface<T>
{
T Value { get; set; }
}
public class SomeOtherClass<T> : ISomeInterface<T>
{
T Value { get; set; }
}
public static class Example
{
public static void Foo()
{
var instance1 = new SomeClass<int>(){ Value = 4; };
var instance2 = new SomeClass<int>(){ Value = 2; };
if (instance1 is ISomeInterface<int>)
{
Console.WriteLine("Instance1 is interface!");
}
if (instance2 is ISomeInterface<int>)
{
Console.WriteLine("Instance2 is interface!");
}
}
}
Expected output is both WriteLines get hit:
Instance1 is interface!
Instance2 is interface!
So now the 'D' version:
interface ISomeInterface(T)
{
T getValue();
}
class SomeClass(T) : ISomeInterface!T
{
private:
T t;
public:
this(T t)
{
this.t = t;
}
T getValue()
{
return t;
}
}
class SomeOtherClass(T) : ISomeInterface!T
{
private:
T t;
public:
this(T t)
{
this.t = t;
}
T getValue()
{
return t;
}
}
...which seems to work the same way with preliminary testing. I
guess my question is...templates are different than generics, but
can I feel confident continuing forward with such a design in D
and expect this more or less to behave as I would expect in C#?
Or are there lots of caveats I should be aware of?