“产品”中的抽象方法 - 工厂方法C#

时间:2010-03-15 07:44:36

标签: c# abstract-class com+ factory-method

我有一个用C#编写的简单类库(COM +服务)来使用5个Web服务: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();
    }
}

但是如果WS中没有定义Compare(),则无法调用Compare()方法。这是因为客户端将使用WS类型对象,而不是CompareWS对象。

这只是两个方法的一个例子,但如果有更多方法呢?在WS类中将所有方法定义为抽象是愚蠢的吗?

我的问题是:我想定义WS的所有子类共有的抽象方法,而当工厂创建WS对象类型时,可以调用子类的所有方法(WS的重写方法以及中的方法)子类)。我该怎么做?

3 个答案:

答案 0 :(得分:0)

您可以声明WS类中所有子类共有的所有方法,但是您应该只声​​明抽象实现将在派生类中更改的那些方法。它不会使Compare方法成为astract。为什么说这种方法无法调用?

您可以在一个类中始终使用抽象和非抽象方法,看起来您的Compare方法不需要是抽象的。

答案 1 :(得分:0)

Regina,抽象类可以定义抽象和虚拟方法。虚方法将在基类中包含一些默认实现,但可以根据需要由派生类覆盖:

    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
    }
}  

答案 2 :(得分:0)

如果类继承自抽象类并且不为所有抽象方法提供主体,那么该类也变为抽象类。这个问题的一个解决方案是使用接口而不是类!

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) {...}
}