> I'll try to think of some more good ideas, but if you have any suggestions, 
> please let me know.

Regarding `$roundMode`, a possible approach is to clarify the priority of the 
current eight values, and if they are different, apply the one with the higher 
priority.

With that in mind, the question that remains is which of the following three 
elements should I give up on?

1. User freedom (inheritability)
2. Commutativity of computation
3. Simplicity

Giving up on 1 means adopting a final class. Giving up 2 means always prefering 
the left operand to determine the properties of the result. (However, I don't 
really like giving up 2)

In this email, I will explain the approach if you give up on 3. This is an 
approach I just came up with earlier.

Take a look at the methods shown below:
```
protected static function resultPropertyRules(string $propertyName, mixed 
$value1, mixed $value2): mixed {}
```

This method determines which operand value to use in the result after 
calculation for a property that the user has defined by extending the class. 
Calling this in the Number class is pointless and will throw an exception. 
Child classes may not necessarily need to override this.

Here are the details. These examples assume that all calculations are performed 
between objects of classes that inherit from Number. Additionally, "properties" 
in the description refer to properties defined by the user.

- Objects to be calculated must be a parent-child relationship or be of the 
same class.
- If they are different objects (parent-child relationship), the calculation 
result will always be the class of the child.
- `resultPropertyRules()` is not called if it is possible to implicitly 
determine which properties the result should have.
- If cannot determine the value of a property that the result should have, call 
`resultPropertyRules()` for that property. In other words, 
`resultPropertyRules()` is called as many times as there are properties that 
need to be evaluated.
- If `resultPropertyRules()` needs to be called and `resultPropertyRules()` is 
not overridden, an exception will be thrown.
- Similarly, if use `resultPropertyRules()` and the value cannot be determined 
properly (for example, if it returns a value of a different type), it will also 
throw an exception.

Supplement: Example when it is possible to determine the value to be used 
implicitly

- If the user has not defined the property
- If all property values ​​are exactly the same
- For objects in a parent-child relationship, if a certain property exists only 
on the child side

Points that need discussion

- Suppose that in an object with a parent-child relationship, a certain 
property is defined on the parent side. In that case, which definition should 
be used for `resultPropertyRules()`, parent or child?
- A more specific case of the above question: What if the visibility of the 
property defined in the parent is private?

Regards.

Saki

Reply via email to