Абстрактные методы в «Продукте» - Фабричный метод C # - PullRequest
0 голосов
/ 15 марта 2010

У меня есть простая библиотека классов (служба COM +), написанная на C # для использования 5 веб-сервисов: Add, Minus, Divide, Multiply и Compare.

Я создал абстрактный продукт и классы абстрактной фабрики. Абстрактный продукт с именем WS-кода:

public abstract class WS
{

    public abstract double Calculate(double a, double b);

    public abstract string Compare(double a, double b);
}  

Как вы видите, когда один из подклассов наследует WS, оба метода должны быть переопределены, что может быть бесполезно в некоторых подклассах. Например. Сравнить не требуется метод Calculate ().

Чтобы создать новый объект CompareWS, клиентский класс вызовет метод CreateWS (), который возвращает тип объекта WS.

public class CompareWSFactory : WSFactory
{
    public override WS CreateWS()
    {
        return new CompareWS();
    }
}

Но если Compare () не определено в WS, метод Compare () не может быть вызван. Это потому, что клиент будет использовать объект типа WS, а не объект CompareWS.

Это только пример с двумя методами, но что, если есть еще методы? Глупо ли определять все методы как абстрактные в классе WS?

У меня вопрос: я хочу определить абстрактные методы, которые являются общими для всех подклассов WS, тогда как, когда фабрика создает тип объекта WS, могут быть вызваны все методы подклассов (переопределенные методы WS, а также методы в подклассы). Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 15 марта 2010

Регина, абстрактные классы могут определять как абстрактные, так и виртуальные методы. Виртуальные методы будут содержать некоторую реализацию по умолчанию в базовом классе, но при необходимости могут быть переопределены производными классами:

    public abstract class WS
{

    // All derived classes will have to implement this
    public abstract double Calculate(double a, double b);

    // This can be overriden by derived classes (since it's a virtual method)
    public virtual string Compare(double a, double b)
    {
        // Some default implementation.
        // Any derived classes can override this implementation if they want
    }
}  
0 голосов
/ 15 марта 2010

Если ваш класс наследует от абстрактного класса и не предоставляет тела для всех абстрактных методов, то этот класс также становится абстрактным. Одним из решений этой проблемы является использование интерфейсов вместо классов!

interface ICalculate
{
   double Calculate(double a, double b);
}
interface ICompare
{
   string Compare(double a, double b);
}
class Compare : ICompare
{
   public double ICompare.Compare(double a, double b) { .... }
}
class CompareAndCalculate : ICompare, ICalculate
{
   public string ICompare.Compare(double a, double b) { .... }
   public double ICalculate.Calculate(double a, double b) {...}
}
0 голосов
/ 15 марта 2010

Вы можете объявить все методы, которые являются общими для всех подклассов в классе WS, но вы должны объявлять абстрактные только те методы, реализация которых будет изменена в производных классах. Не имеет смысла делать Compare метод в качестве абстрактного. Почему вы говорите, что такой метод не может быть вызван?

Вы всегда можете иметь абстрактные и неабстрактные методы в одном классе, и похоже, что ваш Compare метод просто не должен быть абстрактным.

...