【发布时间】:2011-12-20 13:08:36
【问题描述】:
我希望我的班级中的 mutators (setter) 返回 this 以允许类似 jQuery 的 a.name("something").address("somethingelse");
我有一个父类 (Entity) 和几个子类 (Client, Agent etc.)。大多数事物的修改器都继承自 Entity 类(如姓名或地址),但它们返回 Entity 对象,所以我不能在它们上调用客户端修改器。
换句话说:
// name mutator
Entity& Entity::name( const string& name ) {
// [...] checks
_name = name;
return *this;
}
// budgetRange mutator
Client& Client::budgetRange( const long int& range ) {
// [...] checks
_budgetRange = range;
return *this;
}
然后当我调用它时:
Client a; a.name("UserName123").budgetRange(50);
编译器(逻辑上)说,Entity 对象没有budgetRange 成员(因为name 返回的是Entity,而不是Client)。
我现在的问题是:我怎样才能实现这样的东西?我考虑过重载子类中的所有实体函数,但这并不好,而且会违背继承的想法:)
提前感谢您的想法:D
【问题讨论】:
-
google 也为
method chaining和named parameter idiom,这就是你正在做的。请注意,当从Client继承时,您的代码将使用下面的 CRTP 解决方案再次中断。
标签: c++ inheritance parent-child setter mutators