【问题标题】:Abstract Methods in "Product" - Factory Method C#“产品”中的抽象方法 - 工厂方法 C#
【发布时间】:2010-03-16 09:18:42
【问题描述】:

我有一个用 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 的重写方法以及子类)。我该怎么做?

【问题讨论】:

  • 感谢您的评论。让我修改一下我的问题。 WS 类中要定义的抽象方法有 Add()、Minus()、Divide()、Multiply() 和 Compare()。所以为每个方法编写一个接口是不切实际的吧?当然,这只是一个例子。`

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


【解决方案1】:

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】:

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

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

    【讨论】:

    • 我明白了。我提到了 Compare() 方法只有在 WS 中不存在但只有在 CompareWS(WS 的子类)中才可以调用,因为 Concrete Factory 只会创建 WS 类型的对象,而不是 CompareWS。即 WS compareWS = CompareFactory.CreateWS();在这种情况下,调用 compareWS.Compare() 不起作用。
    【解决方案3】:

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

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

    【讨论】:

    • 这种方式可以应用于工厂/抽象工厂方法设计模式吗?我的意思是,这会破坏设计模式吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多