如何使用纯虚函数的C ++类?

时间:2016-04-26 18:17:38

标签: interface

我获得了一个具有纯虚函数的类,如下所示:

class IRecordingHour{
    public:
        virtual int getData() const = 0; 
}  

现在,我有另一个使用IRecordingHour类的类:

 class ProcessRecordingHours { 
public:
ProcessRecordingHours (IRecordingHour &);
proteted:
IRecordingHour & recordingHour;
}

有人告诉我,我不允许实现IRecordingHour类(具有纯虚函数的类)。

我的问题是:如果没有实现IRecordingHour clas,我如何在ProcessingRecordingHours中使用它?也就是说,如何创建IRecordingHour的实例并将其传递给ProcessRecordingHours的构造函数?

3 个答案:

答案 0 :(得分:0)

我认为您的老师计划将IRecordingHour的实施注入ProcessRecordingHours。

此外,您不能使用该类,除非您为IRecordingHour生成存根,或者您自己实现一个虚拟返回值。

/// <summary>
/// in C# and interface can only contain virtual methods. so no need to say virtual.
/// </summary>
interface IRecordingHour
{
    int getData();
}

class MockRecordingHour : IRecordingHour
{
    public int getData()
    {
        //just return something. This will be enough to get ProcessRecordingHours to work
        return 100;
    }
}

/// <summary>
/// this class expects a IRecordingHour.
/// 
/// how we get a IRecordingHour depends on who's implementing it. You, some 3rd party vendor or another developer who's using this class that you've written.
/// 
/// Oh wait. Since you're building ProcessRecordingHours, you need a IRecordingHour to get against. You can use a mocking tool or create one yourself that returns some dummy data
/// </summary>
class ProcessRecordingHours
{
    private IRecordingHour _recording;

    public ProcessRecordingHours(IRecordingHour recording)
    {
        this._recording = recording; 
    }

    public void DoSomething() {
        Console.WriteLine("Recording Data: {0}", this._recording.getData());
    } 

}

答案 1 :(得分:0)

你应该创建一个IRecordingHour的子类并实现方法getData,比如

class ARecordingHour : public IRecordingHour
{
   public:
      int getData() const override //override is valid from C++11 
      {
         return 42;
      }
}

然后你可以这样做:

ARecordingHour arh{};
ProcessRecordingHours prh{arh}; //{}- Modern C++ initialization

您可以在优秀的C ++编程手册中找到类似的示例,例如The C++ Programming Language

答案 2 :(得分:0)

虽然你把它们等同起来,但你的两个问题实际上是完全不同的。

  

如何在ProcessingRecordingHours中使用它?

在没有实现ProcessingRecordingHours的子类的情况下实现IRecordingHour没有特别的问题。你不需要做任何特别的事情。你完全避免依赖IRecordingHour未声明的任何事情,这与你应该做的事情没有什么不同。

  

如何创建IRecordingHour的实例并将其传递给ProcessRecordingHours的构造函数?

你做不到。具有纯虚方法的类无法直接实例化。您的ProcessRecordingHours可以与扩展IRecordingHour的类一起使用,但是如果您不允许创建此类,那么您就无法使用依赖于ProcessRecordingHours类的那些部分IRecordingHour

然而,也许你误解了这个问题。您可能被禁止实现IRecordingHour::getData(),但不能实现一个用具体方法覆盖该方法的子类。这样的子类可以是可实例化的,并且可以与ProcessRecordingHours结合使用。