Имеется класс
class Shape
{
void draw();
}
и некая функция
void f (Shape shape)
{
shape.draw();
}
Зачем описывать аргумент как Shape shape?
Семантически аргумент — это фигура (shape), собственно больше ничего и не нужно:
void f (Shape)
{
Shape.draw();
}
Здесь Shape — это переменная (объект), не тип, ее тип следует из семантики ее имени.
Т.е. class Shape это определение класса, а Shape в выражениях
void f (Shape)
{
Shape.draw();
}
или
class Element
{
Shape;
}
это объявление переменных.
Думаю, такой подход полезен еще вот чем: он требует определения четких пользовательских типов.
В языке нужно вообще не использовать безразмерные типы данных типа int,
но должна быть удобная возможность определять пользовательские типы, в том числе и численные.
Пример:
class Person
{
...
int age;
int weight;
string comment;
}
Компилятор не понимает семантику переменных, для него age + weight — синтаксически корректное выражение.
Семантический вариант:
class Age : [1..150];
class WeightInKilos : [1..200];
class WeightInPounds : [2..450];
class Comment = string;
class Person
{
Age;
WeightInKilos;
Comment;
}
Сложить возраст с весом уже не получится (без преобразования).
Вес в килограммах численно не тоже самое, что и вес в фунтах,
хотя неявное преобразование так и просится.