2009-06-05 5 views
2

Позвольте мне объяснить. Я определил интерфейс с именем IEmployee (ID, свойства FirstName и Surname), но я еще не реализовал этот интерфейс в любом классе.Возможно ли создать экземпляр нового экземпляра интерфейса в VB.NET

То, что я хочу сделать что-то вроде:

Dim User as New IEmployee 
User.ID = 1 
User.FirstName = "" 
User.Surname = "" 

Call SomeFunction (User) 

VB.NET компилятор, кажется, не нравится.

EDIT ** Спасибо всем, все хорошие моменты хорошо сделаны! Я создам конкретный класс. Я просто пытался воспользоваться ярлыком :)

ответ

8

Нет, это не так. Вы не можете создавать экземпляры интерфейсов прямо так: что вы ожидаете от вызовов свойств? Имущественные вызовы вызывают код, но вы не предоставили реализацию. Предположим, вы бы определили метод в интерфейсе, чтобы рассчитать отпускное пособие работника: что вы ожидаете от этого, если вы его вызвали, когда вы еще не реализовали интерфейс?

Точка интерфейса - это указать API, который затем реализуется в конкретных классах - вы не можете использовать интерфейс, не используя его.

(Обратите внимание, что я думаю, что есть некоторые действительно странные ситуации, в которых C# компилятор и, возможно, VB один будет позволяют создать экземпляр интерфейса напрямую, но я думаю, что они COM-специфические ситуации. Я предполагаю, что это ISN это связано с COM. Есть также такие вещи, как RealProxy, которые динамически реализуют интерфейсы и т. д., но опять же я не думаю, что это прямо релевантно.)

+0

Что касается интерфейсов, используемых как DTO (просто носители свойств/полей), это было бы невероятно полезно, я не знаю, будет ли RealProxy или прокси-сервера Marc делать это, но LinFu, безусловно, это делает, или, может быть, это некоторые магия в AutoMapper. В любом случае я могу создать экземпляр интерфейса с помощью AutoMapper, который, как полагают, использует LinFu для этой работы. – Maslow

1

No. Интерфейс - это всего лишь контракт между классом, который его реализует, и Остальная часть мира. Когда код говорит об интерфейсе, он действительно говорит о конкретном фрагменте кода, который «подписал» этот контракт. Подобно тому, как сотрудник, подписавший трудовой договор, связывает их с тем, что они могут делать, реализация интерфейса связывает этот класс. Вы не можете сидеть контрактный документ перед экраном, чтобы набирать вместо человека, и вы не можете попросить интерфейс выполнить какие-либо функции.

Вам нужно будет выбрать конкретную реализацию и создать ее.

0

Вам действительно нужно реализовать интерфейс, прежде чем вы сможете его использовать. Интерфейс - это просто описание того, как объект может действовать - вы не можете взаимодействовать с описанием, вам действительно нужна конкретная реализация, работающая за ним.

0

Интерфейсы определения того, что классы должны выглядеть и поэтому не имеют какой-либо код реализован, но если youreally хотите Вы можете использовать насмешливый, который под одеяло создает прокси-класс, который реализует интерфейс, так что вы можете назвать это,

Поскольку пункт является интерфейсом и по определению не имеет реализации его обычно хорошая идея, чтобы установить ожидания для каждого свойства/метода

http://ayende.com/Blog/archive/2008/06/29/Rhino-Mocks-3.5-Release-Candidate.aspx ссылка

2

есть очень мало вещей, вы можете с пользой использовать интерфейс без конкретной реализации. Вы конечно ничего не можете создать ...

Единственный полезный способ я нашел (с Expression) выражая намерение, например, с помощью RPC:

(кроме)

new Proxy<ISomeService>().Invoke(svc => svc.SomeMethod(123)); 

Это говорит если мы имели ISomeService экземпляр «svc» (которого у нас нет), тогда мы бы назвали SomeMethod проходящей в 3; мы можем затем потянуть Expression, чтобы узнать это.

Во всех других сценариях - если у вас нет конкретной реализации либо во время компиляции, либо во время выполнения (генерация динамического типа), то это не используется вообще.

+0

Поскольку интерфейсы, используемые в качестве DTO (просто носители свойств/полей), это было бы невероятно полезно, я не знаю, будет ли Proxy или RealProxy от Jon делать это, но LinFu, безусловно, это делает, или, может быть, это какая-то магия в AutoMapper. В любом случае я могу создать экземпляр интерфейса с помощью AutoMapper, который, как полагают, использует LinFu для этой работы. – Maslow

0

LinFu, похоже, в состоянии это сделать. Он будет генерировать тип с использованием Reflection.Emit, который будет принимать ваши значения образца. Но реализация метода, если интерфейс имеет методы и вы хотите, чтобы они функционировали, нужно было бы подавать так же, как вы питаете свойства/поля.

0

Java имеет анонимный класс. Вы можете создавать интерфейсы в виде ярлыка, как вы хотите ..., но это не настоящая инкассо. Вы создаете анонимный класс (класс без имени), и этот класс реализует требуемый интерфейс. В Java, это будет так:

public interface Emp{ 
    public String getName(); 
    public void setName(x as String); 
} 

И теперь, в код, который вы хотите создать экземпляр интерфейса:

общественности недействительным основной() {

Emp e = new Emp(){ 
    // interface implementation comes here: 

    private String name; 

    public String getName(){ 
     return this.name; 
    } 

    public void setName(x as String){ 
     this.name = x; 
    } 
} 

e.setName("jackson"); 
System.out.println(e.getName()); 

}

Я думаю, что эта способность изумляет! На мой взгляд, у VB.Net есть намного более классные способности, чем Java, но в этом, Java потрясающий!

+0

есть ли способ достичь этого в vb? – Error404

Смежные вопросы