我获得了一个具有纯虚函数的类,如下所示:
class IRecordingHour{ public: virtual int getData() const = 0; }
现在,我有另一个使用IRecordingHour类的类:
class ProcessRecordingHours {
public:
ProcessRecordingHours (IRecordingHour &);
proteted:
IRecordingHour & recordingHour;
}
有人告诉我,我不允许实现IRecordingHour类(具有纯虚函数的类)。
我的问题是:如果没有实现IRecordingHour clas,我如何在ProcessingRecordingHours中使用它?也就是说,如何创建IRecordingHour的实例并将其传递给ProcessRecordingHours的构造函数?
答案 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
结合使用。