Как определить реализацию интерфейса по умолчанию в C #?

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;
30
задан Simon 6 February 2018 в 07:15
поделиться

3 ответа

А вот и черная магия:

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);
    }
}

Обратите внимание, что вы можете не только инстанцировать интерфейс, но и передавать аргументы его конструктору :-)

33
ответ дан 28 November 2019 в 00:15
поделиться

Только если ISomeInterface является классом.

Обновление (для пояснения):

Джон Скит выступил , где он упоминает реализации интерфейсов по умолчанию. Однако они не являются частью языка C #. Речь идет о том, что Джон Скит хотел бы увидеть в будущей версии C #.

На данный момент единственные реализации по умолчанию выполняются через (возможно абстрактные ) базовые классы.

2
ответ дан 28 November 2019 в 00:15
поделиться

Может быть, вы имеете в виду 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 и вернет новый экземпляр.

Кроме этого, я не знаю ни одной внутриязыковой функции, позволяющей такое поведение.

2
ответ дан 28 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: