【问题标题】:Cocoa Delegation Pattern in C++C++ 中的 Cocoa 委托模式
【发布时间】:2019-02-12 17:30:20
【问题描述】:

我正在尝试在 c++ 中实现可可的委托模式。

我尝试在 imagepicker 示例中模拟可可委托模式,如下所示。但是,我不确定这是在 C++ 中实现的正确方法,并且想知道是否有人有更好的想法。我也注意到 我提出的这个实现与传统的 c++ 委托(?)(see here)无关。我什至不确定上一个链接中的委托实际上是委托模式(我认为它只是函数指针)。

class ImagePickerControllerDelegate {          // defined as protocol in swift

    public:

    virtual void ImagePickerFinished() = 0;

};


class ImagePickerController {

public:

    ImagePickerControllerDelegate * delegate;

private:

    void findImageDirectory()   {}

    void checkUserPermission()  {}

    void loadImage(char* image_name)    {}

    void andDoOtherThings() {}

public:

    void Run()  {

    // doing long stuff here ..
    findImageDirectory();

    checkUserPermission();


    loadImage("lena");

    andDoOtherThings();

    // done, notify

    delegate->ImagePickerFinished();

    // other clean-up etc.
    }

};



class MainViewController: ImagePickerControllerDelegate {


    ImagePickerController ImagePicker = ImagePickerController();

public:

    MainViewController()    {

    this->ImagePicker.delegate = this;

    }

    void UserClicked()  {

    ImagePicker.Run();

    }

    virtual void ImagePickerFinished()  {
    std::cout << "image picker finished..";
    }


};

简而言之,我需要在 C++ 中简单而美观地实现可可委托模式的好建议。我真的不喜欢丑陋的 STL 模板的东西,所以请不要提供使用它的建议/示例。

【问题讨论】:

  • 我想在实现委托接口时你应该做class MainViewController: public ImagePickerControllerDelegate,而不是class MainViewController: ImagePickerControllerDelegate
  • 实现委托的最佳方式是使用纯虚函数,看stackoverflow.com/questions/3130588/…
  • 您可以将std::functionstd::bind 结合使用(或捕获lambda)来摆脱抽象类和继承的需要,仍然可以获得一个优雅的解决方案。但是,std::function 来自 STL,并且确实使用了模板。

标签: c++ ios


【解决方案1】:

我认为 Cocoa SDK 中的委托实现了两种模式:Observer patternDelegate pattern

在您的实现中,您实现了观察者模式的一部分,其中 MainViewController 通知委托有关事件。

可可中的委托模式示例是表视图委托和数据源。表视图为委托和数据源创建单元格和视图。

您的侦听器模式的实现没问题。

【讨论】:

  • 实际上 MainViewController 是被通知的那个。随着用户点击,它开始图像拾取操作,并在拾取完成时收到通知。
  • cocoa 中的大部分 API 在公共 API 中都有一个侦听器(委托)。
猜你喜欢
  • 2019-10-07
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多