Класс, реализующий интерфейс как тип возврата метода в C # - PullRequest
0 голосов
/ 20 декабря 2009

Возможно ли в C # определить тип возвращаемого значения метода как некоторый класс, который дополнительно реализует некоторый интерфейс?

Например, в приложении GTK # я хотел бы иметь виджет для отображения документов. Я хотел бы предоставить несколько реализаций этого виджета - одну на основе Gecko, одну на Webkit и одну базовую на обычном Gtk.TextView. Ясно, что все эти классы должны наследоваться от Gtk.Widget (косвенно). Я бы объявил интерфейс, который реализовали бы все эти виджеты. Наконец, я хотел бы создать фабричный метод, который будет создавать соответствующий виджет, например, на основе. доступные библиотеки. Какой тип должен возвращать фабричный метод?

interface IDocumentView {...};

class GeckoDocumentView : Gecko.Webcontrol, IDocumentView {...};

class WebKitDocumentView : WebKit.WebView, IDocumentView {...};

class BasicDocumentView : Gtk.TextView, IDocumentView {...};

class DocumentViewFactory {
    static IDocumentView CreateView () {...};
}

Какой должен быть тип возвращаемого метода DocumentViewFactory.CreateView? Если невозможно указать и Gtk.Widget, и IDocumentView, это должно быть:

  • Gtk.Widget (базовый класс), который позже будет приведен к IDocumentView?
  • IDocumentView (интерфейс), который позже будет приведен к Gtk.Widget?

РЕДАКТИРОВАТЬ - может ли интерфейс принудительно наследовать от определенного базового класса?

Ответы [ 2 ]

4 голосов
/ 20 декабря 2009

Мне бы хотелось, чтобы код платформы (под которым подпадает GTK #) не превышал мой код .

Учитывая это, я бы предпочел вернуть IDocumentView.

Таким образом, ваш код будет использовать интерфейс IDocumentView, а код вашей платформы может использовать классы Gtk.*.

1 голос
/ 20 декабря 2009

Попробуйте использовать Абстрактный шаблон фабрики .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...