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