C++;设计模式:是否可以将继承的方法私有化到派生类? 是C++中的以下设置/设计模式? 领导阶层 工人阶级 has方法M() MyWorker类(继承Worker)
Leader类有许多Worker,需要从Worker类调用方法M()。但是,我不希望Worker的任何实现(即MyWorker)能够访问方法M()。在这种情况下,公共、私人和保护似乎都不起作用 可以这样设置吗?或者我应该如何设计其他东西 谢谢 编辑:(添加示例案例) 假设M()是GiveMoney(),Leader=Parent,Worker=Child。我只希望父母能给孩子钱(而孩子不能给自己钱) 像这样:C++;设计模式:是否可以将继承的方法私有化到派生类? 是C++中的以下设置/设计模式? 领导阶层 工人阶级 has方法M() MyWorker类(继承Worker),c++,design-patterns,inheritance,C++,Design Patterns,Inheritance,Leader类有许多Worker,需要从Worker类调用方法M()。但是,我不希望Worker的任何实现(即MyWorker)能够访问方法M()。在这种情况下,公共、私人和保护似乎都不起作用 可以这样设置吗?或者我应该如何设计其他东西 谢谢 编辑:(添加示例案例) 假设M()是GiveMoney(),Leader=Parent,Worker=Child。我只希望父母能给孩子钱(而孩子不能给自己钱) 像这样: #include <iostream> class Leader {
#include <iostream>
class Leader
{
private:
virtual char M() = 0;
public:
void foo() { std::cout << M(); }
};
class Worker : public Leader
{
private:
virtual char M() { return 'm'; }
};
打印m
和
class MyWorker : public Worker
{
void foo2() { std::cout << M(); }
};
class MyWorker:公共工作者
{
void foo2(){std::cout您可以:
使M()
成为Worker
中的私有函数,并声明Leader
是Worker
的朋友
将M()
的逻辑从Worker
移到Leader
中。就我个人而言,这是我会采取的方法,因为无论M()
做什么,你都不想让任何其他Worker
去做
你为什么要这样做?你到底想实现什么?知道你的最终目标将帮助我们帮助你找到你想要的答案
如果您想完全隐藏一些实现细节,最好的办法是为worker的公共端创建一个单独的基类,让您的私有worker按组合包含公共位
编辑在我看来,你让自己的生活变得不必要的困难。除非其他人能够控制童工的实施,为什么不直接从童工那里给钱打电话呢
类似的内容可能适用于您的示例:
class Parent // Leader
{
private:
Child* m_pChildren;
};
class Child : public ChildSelf
{
public:
char GiveMoney() { return 'm'; }
};
class ChildSelf
{
Run();
Jump();
ClimbTrees();
};
class MyChild : public ChildSelf
{
void RunFaster() { Run(); Run(); }
};
您的儿童工作者实现只能访问ChildSelf,这为您提供了所需的安全级别。听起来您应该研究访客设计模式:
这不是完全相同的方法,但我相信如果在Leader
类上定义一个Visit(Worker)
方法,在Worker
类上定义一个Accept(Leader)
方法,然后调用private M()
,就可以得到您想要的功能
鉴于我的帖子被否决,我决定提供一些额外的信息可能会有所帮助:
class Leader;
class Worker
{
virtual void M() = 0;
public:
void Accept( const Leader & w)
{
M();
}
};
class Leader
{
public:
void Visit ( Worker & w) const
{
w.Accept(*this);
}
};
class MyWorker : public Worker
{
virtual void M()
{
std::cout << "M()" << std::endl;
}
};
int main(int argc, char **argv)
{
Leader l;
MyWorker myW;
myW.Accept(l)
return 0;
}
班长;
班主任
{
虚空M()=0;
公众:
无效接受(施工负责人和w)
{
M();
}
};
班长
{
公众:
无效访问(工人和工人)施工
{
w、 接受(*本条);
}
};
类别MyWorker:公共工作者
{
虚空M()
{
std::cout将M
私有,并声明Leader
为Worker
的朋友。您仍然可以在Worker
的派生类中实现M
:
class Leader;
class Worker
{
virtual void M() = 0;
friend class Leader;
};
class Leader
{
Worker* w;
public:
void doSomething() { w->M(); }
};
class MyWorker : public Worker
{
void M() { ... } // No problem. Even if `M` is private in the base class, it
// can still be overridden, but not accessed.
};
你希望一个类不能访问它自己的方法,但该方法可以从另一个类调用吗?我认为这在任何语言中都是不可能的。如果将M()定义为private;并通过public进行扩展,则Post代码应该会导致MyWorker无法访问private方法。事实上,M()只要Worker(M()的原始所有者)是调用M()的唯一对象,is private就可以正常工作,因为通常情况下,实例可以对同一类的其他实例上的私有方法/成员进行操作
被定义为私有,Leader
是Worker
的朋友,如果我理解正确,一切都应该按照你的意愿进行。如果我不想让Worker继承Leader呢?例如,假设方法是AddFood()我不希望工人们能够养活自己。然后你必须让Worker
成为Leader
的朋友,或者你必须重写Leader
,这样它就不必调用Worker::M
(例如,将需要调用的功能移动到Worker
类中(但这可能不适合你的特殊情况)。
class Leader;
class Worker
{
virtual void M() = 0;
friend class Leader;
};
class Leader
{
Worker* w;
public:
void doSomething() { w->M(); }
};
class MyWorker : public Worker
{
void M() { ... } // No problem. Even if `M` is private in the base class, it
// can still be overridden, but not accessed.
};