Нашел этот вопрос довольно поздно, но я хотел вмешаться.
Интерфейсы в C # имеют отношение is-a, но не is-an-object. Скорее, это реализация.
Другими словами, для класса Foo, который реализует IBar, следующий тест:
Foo myFoo = new Foo();
return myFoo is IBar;
буквально возвращает истину. Вы также можете сказать,
IBar bar = myArrayList[3] as IBar;
Foo foo = bar as Foo;
Или, если метод требует IBar, вы можете передать Foo.
void DoSomething(IBar bar) {
}
static void Main() {
Foo myFoo = new Foo();
DoSomething(myFoo);
}
Очевидно, что IBar сам по себе не имеет реализации, поэтому отношение can-do также применимо.
interface IBar { void happy(); }
class Foo : IBar
{
void happy()
{
Console.Write("OH MAN I AM SO HAPPY!");
}
}
class Program
{
static void Main()
{
IBar myBar = new Foo();
myBar.happy();
}
}
Но в этом отношении то же самое относится и к наследованию объектов; объект класса Foo, который наследует класс Bar, имеет отношение can-do, а также отношение is-a, так же, как интерфейс. Просто его реализация была заранее построена для него.
Реальный вопрос в том, является ли ... 1019 * что , может ли - что ? Унаследованный объект класса is-a- [родительский экземпляр] и can-do- [поведение родителя] , тогда как реализация интерфейса is-an- [реализация интерфейса ] и, следовательно, can-do- [поведение интерфейса] .
В большинстве случаев, когда используются программные отношения is-a, такие как перечисленные выше, оценивается только интерфейс, поэтому и унаследованный класс, и реализованный интерфейс имеют одинаковые качества is-a и can-do.
НТН,
Jon