Aaa.h
class Aaa {
protected:
static Aaa *defaultAaa;
};
Aaa.cpp
// You must define an actual variable in your program for the static members of the classes
static Aaa *Aaa::defaultAaa;
А вот и черная магия:
class Program
{
static void Main()
{
IFoo foo = new IFoo("black magic");
foo.Bar();
}
}
[ComImport]
[Guid("C8AEBD72-8CAF-43B0-8507-FAB55C937E8A")]
[CoClass(typeof(FooImpl))]
public interface IFoo
{
void Bar();
}
public class FooImpl : IFoo
{
private readonly string _text;
public FooImpl(string text)
{
_text = text;
}
public void Bar()
{
Console.WriteLine(_text);
}
}
Обратите внимание, что вы можете не только инстанцировать интерфейс, но и передавать аргументы его конструктору :-)
Только если ISomeInterface
является классом.
Обновление (для пояснения):
Джон Скит выступил , где он упоминает реализации интерфейсов по умолчанию. Однако они не являются частью языка C #. Речь идет о том, что Джон Скит хотел бы увидеть в будущей версии C #.
На данный момент единственные реализации по умолчанию выполняются через (возможно абстрактные
) базовые классы.
Может быть, вы имеете в виду Dependency Injection? Где при использовании DI фреймворка (например, Ninject или Unity), вы можете определить экземпляр по умолчанию для каждого интерфейса и затем использовать его следующим образом:
(при условии, что у вас есть интерфейс IWeapon
и Sword
его реализует)
IKernel kernel = new StandardKernel();
kernel.Bind<IWeapon>().To<Sword>();
var weapon = kernel.Get<IWeapon>();
Но Ninject (и большинство других IoC-фреймворков) может делать более умные вещи, например: допустим, у нас есть класс Warrior
, который принимает IWeapon в качестве параметра в своем конструкторе. Мы можем получить экземпляр Warrior
из Ninject:
var warrior = kernel.Get<Warrior>();
Ninject передаст указанную нами реализацию IWeapon в метод конструктора Warrior
и вернет новый экземпляр.
Кроме этого, я не знаю ни одной внутриязыковой функции, позволяющей такое поведение.