2016-01-28 3 views
0

Я хочу иметь общий метод между многими классами для выполнения некоторых задач. Это работает, но я не уверен, что это приемлемо .. Пример 2 классов, которые реализуют интерфейс с методом каналов Freeview():Может ли интерфейс использоваться для общих методов между классами?

class BrowserView : ChromiumWebBrowser, IView 
    { 
     public void freeView() 
     { 
      // Some work 
     } 
    } 

class VideoView : Canvas, IView 
{ 
    public void freeView() 
    { 
     // Some work 
    } 
}` 

И я называю метод, как, что в моем главном модуле:

private object activeView = null; 
      switch (settings.vue) 
      { 
       case Vue.Website: 
        activeView = new BrowserView(this, settings.sourcePath); 
        gridView.Children.Add(activeView as BrowserView); 
        break; 
       case Vue.Video: 
        activeView = new VideoView(this, settings.sourcePath); 
        gridView.Children.Add(activeView as VideoView); 
        break; 
      } 

И когда мне нужно вызвать метод с каналами Freeview(), я бросил ActiveView как тот

private void deleteView() 
{ 
    if(activeView != null) 
    { 
     ((IView)activeView).freeView(); 
    } 
} 
+0

Если метод имеет ту же реализацию, вы можете использовать наследование. – Ofiris

ответ

2

Это использование интерфейса является правильным. Тем не менее, вы должны использовать IView интерфейс ссылки вместо object в клиенте, чтобы избежать литья:

private IView activeView = null; 
// ... 
activeView.freeView(); // No casting here! 

Вы также можете добавить еще одну IView реализации, которая делает ничего (null object рисунка), чтобы избежать null проверки в коде:

switch (settings.vue) 
{ 
    case Vue.Website: 
     // ... 
    case Vue.Video: 
     // ... 
    default: 
     activeView = new EmptyView(); 
} 

Так что в коде клиента вы можете просто опустить if(activeView != null) nulltiy check.

2

Это абсолютно приемлемо. Я бы посоветовал вам изменить тип activeView с объекта на IView. Таким образом, вы не должны использовать его для выполнения большинства операций, общих для обоих.

Просто убедитесь, что значения между этими методами остаются неизменными. Если у вас есть общие методы, такие как «выполнить» в IView, вы должны пересмотреть свою стратегию.

1

Когда вы говорите, что реализуете интерфейс IView для своего класса, это означает, что вы добавляете поведение вида в свой класс. Какие когда-либо классы, которые реализуют IView, обещают, что это будет иметь такое поведение.

Таким образом, интерфейс может быть создан специально для общих методов между классами, когда вы хотите получить доступ только к этому конкретному поведению.

Обязательно объявляйте - gridView.Children как List<IView> или что-то еще. Тогда вы можете сделать это напрямую.

activeView = new BrowserView(this, settings.sourcePath); 
gridView.Children.Add(activeView); 

Тогда вы можете получить доступ к методам IView, как есть. Напр.

foreach(var child gridView.Children) 
{ 
    child.FreeView(); 
} 
1

Сделать интерфейсы на основе понятий не потому, что вам нужно сгруппировать несколько методов по классам. Например, интерфейс, такой как IActivatableView, более разумен и понятен клиентам, чем IView. Вы можете использовать несколько интерфейсов для представления различных концепций. Снова технически то, что вы делаете, правильно, но с точки зрения дизайна, я предлагаю, может быть, лучше.

Смежные вопросы