抽象基类是否可以使用非抽象方法?

and*_*ykx 2 c++ coding-style

抽象基类(接口类)通常具有抽象的所有成员函数.但是,我有几种情况,其中使用由调用接口的抽象方法组成的成员函数.我可以在派生但仍然是抽象的类中实现它们,或者我可以将这些方法实现为接口类的非抽象非虚方法.

在接口类中实现方法是否存在设计方面的问题?是不好的风格,如果是这样,为什么?

静态方法是否一样?

例如

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)

Jon*_*eet 9

绝对.这就是模板方法模式的工作原理(虽然不一定是实现接口) - 它是完全可以接受的,而且通常是一个好主意.

Java AbstractList类就是一个很好的例子.

编辑:对不起之前没有回复.你的calcFraction方法在我看来就像是模板方法模式的一个实现 - 它是一个基于调用抽象方法的具体实现.

现在我同意DrPizza - 如果你正在调用某个界面,它实际上不应该有任何实现.可以使抽象基类具有非抽象方法(根据您的问题标题),但我不认为"抽象基类"和"接口类"是等价的.这可能是我的C#和Java背景,您可以将类型声明接口 - 但是不能提供任何实现.