Учитывая следующий код:Как вы сравниваете ссылку класса кислорода на классы?
type
Class1 = public class
end;
Class1Class = class of Class1;
Class2 = public class (Class1)
end;
Class3 = public class (Class1)
end;
Class4 = public class
public
method DoSomething(c: Class1Class): Integer;
end;
implementation
method Class4.DoSomething(c: Class1Class): Integer;
begin
if c = Class2 then
result := 0
else if c = Class3 then
result := 1
else
result := 2;
end;
Как следует DoSomething
на самом деле быть написано, как сравнения равенства забросить ошибку компилятора: Type mismatch, cannot find operator to evaluate "class of Class1" = "<type>"
Использование is
компилирует, но в действительности первая условная всегда имеет значение true
независимо от того, принимается ли Class2
или Class3
.
Цель состоит в том, чтобы написать это кросс-платформенными способами без использования трески специфичный для любой из платформ Oxygene.
Я обновил этот вопрос, чтобы отразить, что я пытаюсь сохранить это кросс-платформенный совместимы. Что касается «почему», это действительно выходит за рамки вопроса. Я предпочитаю отвечать на вопрос (мой собственный, в данном случае), а не говорить «переписать свой код». Практика всегда намного сложнее, чем теория, и я полагаю, что люди могут переписать код самостоятельно. Лично ваше решение кажется немного более неуклюжим и менее элегантным, чем то, что я делаю. Я не могу понять, как это было бы лучше, а не просто другим. – jep
«Почему» редко выходит за рамки. Если то, что вам нужно сделать, может быть достигнуто с помощью виртуализированного поведения в самом классе (кросс-платформенная по своей природе), тогда возможности для таких ошибок могут быть полностью или полностью устранены, а затем вопрос о идентичности класса становится спорным. Опора на идентификатор класса означает, что в любом месте, где ваш код должен изменяться, поведение, основанное на идентификаторе класса, необходимо обновлять каждый раз, когда вы добавляете новый класс, представляя возможность введения ошибок (бездействия) в будущем. Но вы довольны своим подходом, настолько справедливым. :) – Deltics
Ну, место, в которое я столкнулся, было в блоке кода отладки/регистрации, который я запускал. Так что да, вполне счастлив. :) – jep