0

我有一个用 C# 编写的简单类库(COM+ 服务)来使用 5 个 Web 服务:加、减、除、乘和比较。

我创建了抽象产品和抽象工厂类。抽象产品名为 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 的重写方法以及子类中的方法)。我该怎么做?

4

3 回答 3

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
    }
}  
于 2010-03-15T07:57:44.403 回答
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) {...}
}
于 2010-03-15T07:59:55.760 回答
0

您可以在 WS 类中声明所有子类共有的所有方法,但您应该只声​​明那些其实现将在派生类中更改的抽象方法。把Compare方法当作抽象是没有意义的。为什么说这样的方法不能调用?

你总是可以在一个类中拥有抽象和非抽象方法,看起来你的Compare方法不需要是抽象的。

于 2010-03-15T07:53:47.397 回答