代码之家  ›  专栏  ›  技术社区  ›  andreas buykx

抽象基类有非抽象方法可以吗?

  •  2
  • andreas buykx  · 技术社区  · 15 年前

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

    在接口类中实现方法在设计上有什么问题吗?是不是不好的款式,如果是,为什么?

    静态方法也一样吗?

    例如

    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;
    };
    

    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;
    };
    
    6 回复  |  直到 15 年前
        1
  •  2
  •   DrPizza    15 年前

    如果 您将其称为一个接口(即,通过使用命名约定“ifoo”,您似乎就是这样的接口),那么它应该是一个纯接口(没有实现)。

    如果它只是一个抽象类,那么纯虚拟方法和实现方法的混合是完全合理的。

        2
  •  9
  •   Jon Skeet    15 年前

    当然。这就是如何 template method pattern 工作(尽管这不一定实现一个接口)-它是完全可以接受的,而且通常是一个好主意。

    爪哇 AbstractList 类就是一个很好的例子。

    编辑:很抱歉之前没有回复。你的 calcFraction 方法在我看来像是模板方法模式的实现——它是基于调用抽象方法的具体实现。

    现在我同意Drpizza的观点——如果您将某个东西称为接口,那么它实际上不应该有任何实现。抽象基类可以有非抽象方法(根据您的问题标题),但我不认为“抽象基类”和“接口类”是等效的。这可能是我的C语言和Java背景,在这里你可以声明类型。 作为 一个接口-但不能提供任何实现。

        3
  •  1
  •   Paddy    15 年前

    是的,当然。这是使用抽象类而不是接口的原因之一。

        4
  •  1
  •   Thorsten Dittmar    15 年前

    我一直认为抽象类的实际用途是:实现一些对所有子代通用的基本行为,但使派生类特有的部分抽象化。

        5
  •  0
  •   Steve Rowe    15 年前

    对。在抽象基类中实现方法(虚方法或非虚方法)是非常好的,而且通常是可取的。如果你真的想要一个接口,最好使用你的第二个结构,这样读者就可以清楚地使用它,但是两者都是完全合法的C++。如果存在实现,我就不会使用“i”指示符。

        6
  •  0
  •   Gilad Naor    15 年前

    我认为没有理由不在抽象类中进行一些实现。