If you add some explicit drops that represent what Trepresents at the point Timer.Add(TimedDoorObject), it is called more obvious what is happening.
public class BaseClient<T> where T : ITimeable
{
public T TimedDoorObject;
public virtual void Init()
{
Timer.Add((ITimeable)TimedDoorObject);
}
}
public class Client : BaseClient<TimedDoor>
{
public Client()
{
TimedDoorObject = new TimedDoor();
}
public override void Init()
{
Timer.Add((TimedDoor)TimedDoorObject);
}
}
, BaseClient , , , T - - ITimeable, , , void Add(ITimeable obj). Client , T a TimedDoor, void Add(TimedDoor obj), , void Add(ITimeable obj).