c++ 如何将派生的(“/“)访问修饰符写入cpp代码?

umuewwlo  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(88)

有没有正确的方法把下面的UML图写进c++?
UML类图:

如果是这样,如何从给定的图中用c++写?我在“/”部分(“派生访问修饰符“)感到困惑。
仅供参考:我是UML图的新手

slwdgvem

slwdgvem1#

"/"意味着属性是派生的。这反过来意味着它来自"更高的领域",这意味着例如来自一个通用类或来自使用其他属性的一些计算。UML 2.5的第17页说
属性:每个属性都由其名称、类型和多重性以及任何其他属性(如{readOnly})指定。如果未列出多重性,则默认为1..1。后跟对属性的用途和含义的文本说明。如果派生属性,则名称前面将加一个正斜杠。如果派生属性,推导的逻辑在大多数情况下使用OCL示出。
因为所示的图没有告诉派生逻辑,所以你不能告诉任何关于它的东西。暂时实现一个简单的属性或从其父属性中离开它。在结束编码之前,你必须获得规则来使它成为一个正确的实现。

sh7euo9m

sh7euo9m2#

从UML到C++没有统一的Map,因为有很多方法可以实现设计意图。
对于派生属性,有三种常用策略:

  • 使用一个getter,在需要时派生(计算)该值:
class Professor {
public: 
    …
    int getSalary() const {
       // some computation, e.g:
       return salaryScale(yearsOfService)+numberOfClasses*CLASS_BONUS;
    }
    …
 };
  • 使用一个属性,并在每次参数改变时用计算更新它。然而,只有当计算只依赖于私有成员并且难以维护时,这才是可靠的:
class Professor {
private:
    int salary;
    …
public: 
    …

    int getSalary() const {
       return salary; 
    }
    void setYearsOfService(int n)
        yearsOfService=n;
       // update:
       salary =  salaryScale(yearsOfService);
       // better put the calculation in a private function, to not repeat formula multiple times
    }
    …
 };
  • 使用一个智能的getter,它将值缓存在私有的salary属性中,但是只在需要的时候才计算它。这个想法是有一个“dirty”标志,当对象的状态改变的时候就设置这个标志,并且如果getter被调用并且dirty标志被设置,就重新计算这个值。但是要注意,这可能会使维护更加困难。此外,如果派生依赖于关联的对象,你需要考虑观察者模式,所以我建议在计算量很大的情况下,把这种方法作为最后的手段。

顺便说一下,/没有提到任何关于可见性的东西(我在我的例子中只是假设了public),而+-#在C中是指publicprivateprotected,而UML的~包可见性在C中没有等价物。

相关问题