Как я могу иметь класс, который реализует интерфейс и наследуется от абстрактного класса? (C # .NET 3.5) - PullRequest
0 голосов
/ 19 марта 2009

У меня есть ситуация, в которой, я думаю, мне нужны функциональные возможности, предоставляемые интерфейсом и абстрактным классом.

Я создаю модели для использования в симуляции. Каждая модель содержится в классе C #, который реализует интерфейс IModel (моего дизайна, поэтому он может быть изменен). Я также создал неуправляемую библиотеку Win32 DLL на языке c ++, которая служит мостом между моими классами модели C # и средой моделирования. Классы модели вызываются через COM, поэтому требуется интерфейс.

Я только что получил новое требование, чтобы эти классы моделей могли вызываться через веб-сервис независимо от среды моделирования. Теперь эти модели довольно чувствительны, и клиент запросил, чтобы они были настроены клиентом и выполнены на сервере *. Я подумал, что это было бы возможно, если бы я сделал классы моделей наследуемыми от абстрактного класса, а затем создал метод веб-службы на сервере:

public AbstractModel executeModel(AbstractModel modelForExecution)

, который получает объект модели от клиента, выполняет его и заполняет его результатами.

НО - я не могу использовать абстрактный класс, потому что модели требуют интерфейса для реализации COM.

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

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

Ответы [ 2 ]

5 голосов
/ 19 марта 2009
public abstract class Base{}
public interface IBase{}
public Something: Base, IBase{} 
// the interface needs to go after the base class
1 голос
/ 19 марта 2009

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

public interface IModel {
  void doSomething();
}

public abstract class AbstractModel : IModel {
  public abstract void doSomething();
}

public class MyModel : AbstractModel {
  public void doSomething() {
    // code goes here
  }
}

Возможно, вам придется использовать ключевое слово 'overrides' в методе реализации (вам сообщит компилятор).

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