Ваш пример не совсем продуман.
Логичнее было бы предположить, что есть некоторый общий интерфейс, который будет объединять все классы и при этом представлять общие функции над операндами различных типов.
Допустим, вам нужно будет выполнять сложение с двумя аргументами.
Например так:
$math = new Calculator(); // в данном случае Number плохое имя, т.к. обозначает число, а не аггрегатор вычислительных операций
echo $math->sum(1, 2); // вернет 3
echo $math->sum(1.3, 2.7); // вернет 4.0
В данном случае один и тот же метод применяется к двум операндам различных типов. Вроде бы все красиво, но не совсем. В данном случае методы являются чистыми функциями и логичнее было бы их вызывать как статические методы, например так:
echo Calculator::sum(1, 2); // вернет 3
echo Calculator::sum(1.3, 2.7); // вернет 4.0
Реализация класса будет выглядеть примерно так
class Calculator
{
/**
* Метод предназначен для суммирования двух аргументов
* @param number $firstArgument первый аргумент
* @param number $secondArgument второй аргумент
*/
public static function sum($firstArgument, $secondArgument)
{
return $firstArgument + $secondArgument;
}
}
В данном случае не нужно изобретать велосипедов, т.к. все функции работы над числами универсальны.