是否可以在VB.NET中实例化接口的新实例

时间:2009-06-05 10:28:56

标签: .net vb.net

让我解释一下。我已经定义了一个名为IEmployee的接口(ID,FirstName和Surname属性),但我还没有在任何类中实现该接口。

我想做的是:

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

Call SomeFunction (User)

VB.NET编译器似乎不喜欢这个。

编辑**谢谢大家,所有优点都做得很好!我将实例化一个具体的类。我只想尝试一条捷径:)

7 个答案:

答案 0 :(得分:8)

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

接口的目的是指定一个API,然后在具体的类中实现 - 如果没有正确实现它的东西,就不能使用该接口。

(注意,我认为有一些非常奇怪的情况,其中C#编译器和可能的VB 将允许您直接实例化接口,但我认为它们是特定于COM的情况。我认为这与COM无关。还有RealProxy等动态实现接口等的东西,但我不认为它直接相关。)

答案 1 :(得分:2)

在没有具体实现的情况下,很少有东西可以用于界面。您当然无法创建任何内容......

我发现的唯一有用的方法是(用Expression)表达意图,例如使用RPC:

(除外)

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

这说 如果 我们有ISomeService个实例“svc”(我们没有),那么我们就会调用SomeMethod传球3;然后,我们可以将Expression分开以找到它。

在所有其他场景中 - 如果您在编译时或运行时(动态类型生成)没有具体实现,那么它就没有任何用处。

答案 2 :(得分:1)

没有。接口只是实现它的类与世界其他地方之间的契约。当代码谈到一个接口时,它实际上是在谈论一个已经“签署”该合同的具体代码。正如签署雇佣合同的员工将他们与他们能做的事情联系起来一样,实施界面会对班级产生影响。你不能将合同文件放在屏幕前面来代替人类,你也不能要求界面执行任何功能。

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

答案 3 :(得分:0)

您真的需要在使用之前实现该接口。接口只是对对象如何行为的描述 - 您无法与描述交互,您真的需要在其后面运行的具体实现。

答案 4 :(得分:0)

接口是应该是什么类的定义,因此没有实现任何代码,但如果你真的想要 您可以使用模拟,它在封面下创建一个实现接口的代理类,然后您可以调用它,

由于该项目是一个界面,并且根据定义没有实现,通常最好为每个属性/方法设置期望

http://ayende.com/Blog/archive/2008/06/29/Rhino-Mocks-3.5-Release-Candidate.aspx 是链接

答案 5 :(得分:0)

LinFu似乎能够做到这一点。 它将使用Reflection.Emit生成一个类型,该类型将接受您的样本值。但是如果接口有方法并且你希望它们能够运行的方法实现必须以与提供属性/字段相同的方式提供。

答案 6 :(得分:0)

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

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

现在,在您想要实例化界面的代码中:

public void 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是惊人的!