是否可以在VB.NET中实例化一个接口的新实例
让我解释一下。我已经定义了名为IEmployee(ID,FirstName和Surname属性)的接口,但是我还没有在任何类中实现该接口。是否可以在VB.NET中实例化一个接口的新实例
我想要做的是一样的东西:
Dim User as New IEmployee
User.ID = 1
User.FirstName = ""
User.Surname = ""
Call SomeFunction (User)
的VB.NET编译器似乎并不喜欢这样。
编辑**感谢所有,所有好点都做好了!我将实例化一个具体的类。我只是想采取一个快捷方式:)
不,它不会。您不能像这样直接创建接口实例:您希望属性调用要做什么?属性调用会调用代码 - 但您尚未提供实现。假设你要在界面中定义一个方法来计算员工的假日津贴:如果你调用它,当你没有在任何地方实现接口,你会期望做什么?
接口的要点是指定一个API,然后在具体类中实现 - 如果没有正确实现它,就不能使用接口。 (请注意,我认为有一些非常奇怪的情况,其中C#编译器和VB可能允许你直接实例化接口,但我认为它们是COM特定的情况。我认为这是不正确的与COM没有关系,还有一些像RealProxy
这样的动态实现接口等,但我认为它不是直接相关的。)
不。接口只是一个实现它的类和剩下的世界。当代码谈论一个接口时,它实际上是在谈论签署了该合同的一段具体代码。正如签署雇佣合同的员工将他们与他们所能做的一样,实施一个接口就会对班级产生约束。您不能将合同文档放置在屏幕前面以键入人的位置,并且您不能要求界面执行任何功能。
你必须选择一个具体的实现,并将其实例化。
在使用它之前,您确实需要实现该接口。接口只是一个对象如何操作的描述 - 你不能与描述交互,你真的需要一个具体的实现在它后面运行。
接口是类应该像,所以什么定义,不要有任何的代码实现,但如果youreally想 你可以用嘲讽,这在幕后创建一个实现该接口的代理类,这样你就可以调用它,
由于该项目是一个接口,通过定义有没有实现它通常是一个好主意,为每个属性/方法
http://ayende.com/Blog/archive/2008/06/29/Rhino-Mocks-3.5-Release-Candidate.aspx 预期是链接
很少有事情你可以在没有具体实现的情况下使用接口。你当然不能创造任何东西...
我发现的唯一有效方法是(与Expression
)表达的意图,例如使用RPC:
(预留)
new Proxy<ISomeService>().Invoke(svc => svc.SomeMethod(123));
这是说如果我们有一个ISomeService
实例“svc”(我们不这样做),那么我们打电话给SomeMethod
传入3;然后我们可以将Expression
分开找出来。
在所有其他情况下 - 如果在编译时或运行时(动态类型生成)没有具体的实现,那么它就没有任何用处。
至于用作DTO的接口(只是属性/字段载体),这将是非常有用的,我不知道Proxy或Jon的RealProxy是否可以这样做,但LinFu肯定会这样做,或者它可能有些魔力AutoMapper。无论哪种方式,我都能够使用AutoMapper生成一个接口的实例,该实例似乎依赖于LinFu的工作。 – Maslow 2009-11-19 14:42:40
LinFu似乎能够做到这一点。 它将生成一个使用Reflection.Emit的类型,它将接受您的示例值。但是,如果接口有方法并希望它们起作用,那么方法实现必须以与您在属性/字段中输入相同的方式来提供。
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非常棒!
有没有什么办法可以在vb中实现这一点? – Error404 2016-08-22 19:37:23
至于用作DTO的接口(只是属性/字段载体),这将是非常有用的,我不知道RealProxy或Marc的代理是否会这样做,但LinFu肯定会这样做,或者它可能是一些AutoMapper中的魔法。无论哪种方式,我都能够使用AutoMapper生成一个接口的实例,该实例似乎依赖于LinFu的工作。 – Maslow 2009-11-19 14:41:48