抽象基类(接口类)通常具有抽象的所有成员函数.但是,我有几种情况,其中使用由调用接口的抽象方法组成的成员函数.我可以在派生但仍然是抽象的类中实现它们,或者我可以将这些方法实现为接口类的非抽象非虚方法.
在接口类中实现方法是否存在设计方面的问题?是不好的风格,如果是这样,为什么?
静态方法是否一样?
例如
class IFoo
{
public:
virtual ~IFoo();
virtual double calcThis( InputType p ) const = 0;
virtual double calcThat( InputType p ) const = 0;
double calcFraction( InputType p ) { return calcThis( p ) / calcThat( p ); }
static BarType bar( InputType p );
};
class MyFoo : public IFoo
{
public:
// implements IFoo
virtual double calcThis( InputType p ) const;
// implements IFoo
virtual double calcThat( InputType p ) const;
};
Run Code Online (Sandbox Code Playgroud)
与
class IFoo
{
public:
virtual ~IFoo();
virtual double calcThis( InputType p ) const = 0;
virtual double calcThat( InputType p ) const = 0;
};
class FooBase : public IFoo
{
public:
virtual ~FooBase();
double calcFraction( InputType p ) { return calcThis( p ) / calcThat( p ); }
static BarType bar( InputType p );
};
class MyFoo : public FooBase
{
public:
// implements IFoo
virtual double calcThis( InputType p ) const;
// implements IFoo
virtual double calcThat( InputType p ) const;
};
Run Code Online (Sandbox Code Playgroud)
绝对.这就是模板方法模式的工作原理(虽然不一定是实现接口) - 它是完全可以接受的,而且通常是一个好主意.
Java AbstractList类就是一个很好的例子.
编辑:对不起之前没有回复.你的calcFraction方法在我看来就像是模板方法模式的一个实现 - 它是一个基于调用抽象方法的具体实现.
现在我同意DrPizza - 如果你正在调用某个界面,它实际上不应该有任何实现.可以使抽象基类具有非抽象方法(根据您的问题标题),但我不认为"抽象基类"和"接口类"是等价的.这可能是我的C#和Java背景,您可以将类型声明为接口 - 但是不能提供任何实现.