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)
请告诉我,上述两个实例之间有什么区别?
不同之处在于obj1键入为实例,abc并obj2键入为实例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.
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |