Два очень разные. Используя 'new', вы создаете новую цепочку наследования. Это означает, что любые реализации II2
должны будут реализовывать обе версии F()
, и фактическая версия, которую вы в конечном итоге вызываете, будет зависеть от типа ссылки.
Рассмотрим следующие три реализации:
class A1 : II1
{
public void F()
{
// realizes II1.F()
}
}
class A2 : II2
{
void II1.F()
{
// realizes II1.F()
}
void II2.F()
{
// realizes II2.F()
}
}
class A3 : II2
{
public void F()
{
// realizes II1.F()
}
void II2.F()
{
// realizes II2.F()
}
}
Если у вас есть ссылка на A2
, вы не сможете вызвать ни одну из версий F()
без предварительного приведения к II1
или II2
.
A2 a2 = new A2();
a2.F(); // invalid as both are explicitly implemented
((II1) a2).F(); // calls the II1 implementation
((II2) a2).F(); // calls the II2 implementation
Если у вас есть ссылка на A3
, вы сможете напрямую вызывать версию II1
, поскольку она подразумевается:
A3 a3 = new A3();
a3.F(); // calls the II1 implementation
((II2) a3).F(); // calls the II2 implementation