创建类和inteface的对象有什么区别(参见下面的例子)?

Neo*_*Neo 2 c# interface

interface i1
{
    void add();
}

class abc : i1
{
    public void add()
    {
        Console.WriteLine("hi! add");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在Main我创建两个对象,如:

abc obj1 = new abc();
Run Code Online (Sandbox Code Playgroud)

i1 obj2 = new abc();
Run Code Online (Sandbox Code Playgroud)

请告诉我,上述两个实例之间有什么区别?

jas*_*son 9

不同之处在于obj1键入为实例,abcobj2键入为实例i1.这两个变量都是对实例的引用abc,但不同之处在于代码中可以访问的内容.假设您有以下内容:

interface IFoo { void Bar(); }
public class Foo : IFoo {
    public void Bar() { Console.WriteLine("Foo.Bar!"); }
    public void Baz() { Console.WriteLine("Baz!"); }
}
Run Code Online (Sandbox Code Playgroud)

然后:

Foo foo = new Foo();
IFoo iFoo = new Foo();
Run Code Online (Sandbox Code Playgroud)

那么以下是合法的:

foo.Baz();
Run Code Online (Sandbox Code Playgroud)

但这不是:

iFoo.Baz(); // compile-time error
Run Code Online (Sandbox Code Playgroud)

关键是编译器不知道参考文件iFoo实际上是a Foo,因此有一个方法Baz.特别要注意这是可能的:

public class FooFoo : IFoo {
    public void Bar() { Console.WriteLine("FooFoo.Bar!"); }
}

IFoo foofoo = new FooFoo();
foofoo.Baz(); // not legal
Run Code Online (Sandbox Code Playgroud)

请注意,这样做是不合法的,而且很明显为什么.您可以通过类型变量调用的唯一方法是IFoo在接口中定义的方法,而不管类型变量引用的具体类型上可能存在的任何方法IFoo.