Создание экземпляра интерфейса в c#

Я использую интерфейс в C# и вместо того, чтобы писать совершенно новый класс, который реализует этот интерфейс можно просто создать объект, который реализует этот интерфейс? Интерфейс определяется как

public interface ITokenStore
{

    IToken CreateRequestToken(IOAuthContext context);


    IToken CreateAccessToken(IOAuthContext context);
}

и я знаю, что на java я мог бы что-то вроде

ITokenStore tokenStore = new ITokenStore()
    {
        IToken CreateRequestToken(IOAuthContext context) {
            IToken requestToken = null;

            return requestToken;
        }

        IToken CreateAccessToken(IOAuthToken context) {
            IToken accessToken = null;

            return accessToken;
        }
    };

есть ли эквивалентный способ создания экземпляра в экземпляре интерфейса в C#?

7 ответов


единственный способ "создать экземпляр интерфейса в C#" - это создать экземпляр типа, реализующего интерфейс.


интерфейсы не имеют логики в них по дизайну. Они просто ничего не делают.

создание экземпляра без класса реализации даже не имеет смысла


Если вы действительно хотите этого:

    private static void Main(string[] args)
    {
        IFoo foo = new IFoo(); // <- interface
        foo.Print();

        Console.ReadKey();
    }


    [ComImport, Guid("A7D5E89D-8FBD-44B7-A300-21FAB4833C00"), CoClass(typeof(Foo))]
    public interface IFoo
    {
        void Print();
    }

    public class Foo : IFoo
    {
        public void Print()
        {
            Console.WriteLine("Hello!");
        }
    }

но если вы откроете скомпилированную сборку на ildasm.exe, вы увидите:

IL_0001: newobj instance void TestApp.Program/Foo::.ctor()


насколько я знаю, .NET не имеет концепции Java анонимных внутренних классов. Существует типичная потребность в динамических реализациях интерфейса в сценариях модульного тестирования. Так что может быть взгляд на некоторые динамические насмешливые рамки может быть интересным для вас, например

  1. Экспромт Интерфейс (включает поддержку динамический)
  2. Moq

посмотрите на галерею NuGet для пакетов с тегом издевательский.


вы не можете создать экземпляр интерфейса в C#. Необходимо создать экземпляр класса / типа, который реализует этот интерфейс.

захотите прочитать о интерфейсы в C#. Нет никакого способа "подделать" его, как это делает Java.

Я добр, если заинтригован этой концепцией, хотя, поскольку это что-то доступное на другом языке. Я полагаю, вы можете использовать анонимный класс с параметрами делегата, если ваш потребитель знал, как подделать утка набрав. Но вряд ли это того стоит.


что-то вроде этого:

public class MyTokenStore: ITokenStore
{
    public IToken CreateRequestToken(IOAuthContext context)
    {
        ...some code here...
    }
    public IToken CreateAccessToken(IOAuthContext context)
    {
        ...some code here...
    }
}

затем использовать его:

ITokenStore x = new MyTokenStore();

как другие сказали, Нет, это невозможно.

однако вы можете написать один обобщенный класс, который имеет делегаты для каждого метода. Что-то вроде следующего:

public class DelegateTokenStore : ITokenStore
{
    public delegate IToken TokenCreator(IOAuthContext context);
    public TokenCreator RequestTokenCreator { get; set; }
    public TokenCreator AccessTokenCreator { get; set; }

    public IToken CreateRequestToken(IOAuthContext context)
    {
        return RequestTokenCreator(context);
    }

    public IToken CreateAccessToken(IOAuthContext context)
    {
        return AccessTokenCreator(context);
    }
}

тогда вы можете использовать его следующим образом:

ITokenStore tokenStore = new DelegateTokenStore()
{
    RequestTokenCreator = (context) =>
    {
        IToken requestToken = null;
        return requestToken;
    },
    AccessTokenCreator = (context) =>
    {
        IToken accessToken = null;
        return accessToken;
    },
};

Я не говорю, что это обязательно хорошая идея, чтобы использовать этот подход. Как и все, уместность зависит от вашего варианта использования.