2009-06-05 110 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编译器似乎并不喜欢这样。

编辑**感谢所有,所有好点都做好了!我将实例化一个具体的类。我只是想采取一个快捷方式:)

回答

8

不,它不会。您不能像这样直接创建接口实例:您希望属性调用要做什么?属性调用会调用代码 - 但您尚未提供实现。假设你要在界面中定义一个方法来计算员工的假日津贴:如果你调用它,当你没有在任何地方实现接口,你会期望做什么?

接口的要点是指定一个API,然后在具体类中实现 - 如果没有正确实现它,就不能使用接口。 (请注意,我认为有一些非常奇怪的情况,其中C#编译器和VB可能允许你直接实例化接口,但我认为它们是COM特定的情况。我认为这是不正确的与COM没有关系,还有一些像RealProxy这样的动态实现接口等,但我认为它不是直接相关的。)

+0

至于用作DTO的接口(只是属性/字段载体),这将是非常有用的,我不知道RealProxy或Marc的代理是否会这样做,但LinFu肯定会这样做,或者它可能是一些AutoMapper中的魔法。无论哪种方式,我都能够使用AutoMapper生成一个接口的实例,该实例似乎依赖于LinFu的工作。 – Maslow 2009-11-19 14:41:48

1

不。接口只是一个实现它的类和剩下的世界。当代码谈论一个接口时,它实际上是在谈论签署了该合同的一段具体代码。正如签署雇佣合同的员工将他们与他们所能做的一样,实施一个接口就会对班级产生约束。您不能将合同文档放置在屏幕前面以键入人的位置,并且您不能要求界面执行任何功能。

你必须选择一个具体的实现,并将其实例化。

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或Jon的RealProxy是否可以这样做,但LinFu肯定会这样做,或者它可能有些魔力AutoMapper。无论哪种方式,我都能够使用AutoMapper生成一个接口的实例,该实例似乎依赖于LinFu的工作。 – Maslow 2009-11-19 14:42:40

0

LinFu似乎能够做到这一点。 它将生成一个使用Reflection.Emit的类型,它将接受您的示例值。但是,如果接口有方法并希望它们起作用,那么方法实现必须以与您在属性/字段中输入相同的方式来提供。

0

Java有一个匿名类。您可以将接口实例化为您想要的快捷方式,但它不是真正的接口实例化。你创建一个匿名类(一个没有名字的类)并且该类实现你想要的接口。在Java中,这将是这样的:

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

而现在,在你的代码要实例接口:

公共无效的main(){

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 2016-08-22 19:37:23

相关问题