Это общий вопрос дизайна. Мы часто используем интерфейсы для разделения компонентов, записи в интерфейс, а не в реализацию и т. д. Иногда интерфейсы используются с базовой техникой внедрения, например,
interface IMyInterface
{
void DoSomething();
}
static class IMyInterfaceFactory
{
public static IMyInterface GetInstance()
{
return new MyInterfaceInstance();
}
}
class IMyInterfaceConsumer
{
IMyInterface mInterface;
public IMyInterfaceConsumer()
{
this.mInterface = IMyInterfaceFactory.GetInstance();
}
public void UseTheInterface()
{
this.mInterface.DoSomething();
}
}
Мой вопрос касается использования ключевого слова var вместо этого. Даже не используя настоящий интерфейс C #, но все же создавая «интерфейс» в смысле дизайна,
static class IMyInterfaceFactory
{
// of course, this doesnt need to be a single instance
static MyInterfaceInstance mSingleInstance;
// no longer programming to the interface, just returning the instance
public static MyInterfaceInstance GetInstance()
{
// null coalesce
return mSingleInstance ?? (mSingleInstance = new MyInterfaceInstance());
}
}
class IMyInterfaceConsumer
{
public void UseTheInterface()
{
// shorthand way, could also omit var, too
var myInterface = IMyInterfaceFactory.GetInstance();
myInterface.DoSomething();
}
}
Таким образом, мне все еще нужно изменить фабрику только один раз, и пока любой возвращаемый экземпляр поддерживает методы, которые необходимо использовать, он будет работать. Преимущество, однако, заключается в том, что производящие и потребляющие объекты даже не должны знать о каком-либо явном интерфейсе, поскольку его не существует. Он также может чисто поддерживать интерфейс с более чем парой методов (предотвратить раздутые объявления интерфейса).
Одним очевидным недостатком является то, что каждый раз, когда вы хотите использовать метод из «интерфейса», фабрике потенциально придется повторно создавать экземпляр класса, если только не кэшируется один экземпляр (как указано выше) или не используется какой-либо метод мемоизации.
Плюсы/минусы этого подхода? Это обычная практика?
// shorthand way, could also omit var, too
-- как? - person Austin Salonen   schedule 20.09.2012var
иdynamic
. - person Austin Salonen   schedule 20.09.2012