Попробуйте использовать in
вместо ref
на proc add
:
class Class2 {
var y : int;
}
class Class3 : Class2 {
var z : int;
}
class Class1 {
var count : int;
var x : [0..10] owned Class2?;
proc add(in a : Class2) {
x[count] = a;
count += 1;
}
}
var C1 = new owned Class1();
var C2 = new owned Class2();
var C3 = new owned Class3();
C1.add(C2); // OK
C1.add(C3); // OK!
Почему это важно? Передача ссылки на подкласс (Class3) в аргумент, ожидающий ссылку на родительский класс (Class2), небезопасна. В частности, вы можете себе представить, что метод изменяет указатель класса на Class2, а не Class3, и это может привести к другим ошибкам на сайте вызова.
Я предполагаю, что функция add
использовала функциюref
Намерение просто включить передачу права собственности от C3
. Намерение in
является лучшим способом сделать это и поддерживает передачу подтипа (поскольку описанная выше ситуация с ошибкой типа невозможна).