Создание экземпляра интерфейса в 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 анонимных внутренних классов. Существует типичная потребность в динамических реализациях интерфейса в сценариях модульного тестирования. Так что может быть взгляд на некоторые динамические насмешливые рамки может быть интересным для вас, например
- Экспромт Интерфейс (включает поддержку динамический)
- 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;
},
};
Я не говорю, что это обязательно хорошая идея, чтобы использовать этот подход. Как и все, уместность зависит от вашего варианта использования.