Разница в том, что 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!"); }
}
Тогда:
Foo foo = new Foo();
IFoo iFoo = new Foo();
Тогда допустимо следующее:
foo.Baz();
но это не так:
iFoo.Baz(); // compile-time error
Дело в том, что компилятор не знает, что референт iFoo
на самом деле Foo
и поэтому имеет метод Baz
.В частности, обратите внимание, что это возможно:
public class FooFoo : IFoo {
public void Bar() { Console.WriteLine("FooFoo.Bar!"); }
}
IFoo foofoo = new FooFoo();
foofoo.Baz(); // not legal
Обратите внимание, что это не разрешено, и понятно, почему.Единственные методы, которые вы можете вызывать через переменную типа IFoo
, это методы, определенные в интерфейсе, независимо от любых методов, которые могут существовать в конкретном типе, на который ссылается переменная типа IFoo
.