Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2021, 21:35   #1
Кверт
Пользователь
 
Регистрация: 09.08.2021
Сообщений: 15
По умолчанию PascalABC.NET 3.8.1. Что сделать, чтобы writeln(obj) выводил объект

PascalABC.NET 3.8.1
Код:
  Type
  MyClass = class
    a: integer; 
  end; 
 
begin 
  var obj := new MyClass; 
  obj.a:=12;
  Writeln(obj.a);   // выдает: 12
  writeln(obj);     // выдает: () - а ожидалось: (12)
end.
writeln(obj) - выдает пустые скобки: (). А не (12), как хотелось бы.
Если же класс сделать автоклассом:
Type
MyClass = auto class
...
end;
- то writeln(obj) - выдает как надо: (12).
Читал, что автокласс неявно создает конструктор Create для всех полей
(в этом примере для одного поля a: Create(arg_a)),
а также генерирует метод .ToString,
что и позволяет выводить объект целиком с помощью writeln(obj).

Ну а если не автокласс - что сделать, чтобы writeln(obj) выводил объект?
Кверт вне форума Ответить с цитированием
Старый 27.09.2021, 22:08   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Из справки:
Цитата:
Вывод переменной типа класс
По умолчанию процедура write для переменной типа класс выводит содержимое её публичных полей и свойств в круглых скобках через запятую.
Чтобы изменить это поведение, в классе следует переопределить виртуальный метод ToString класса Object - в этом случае именно он будет вызываться при выводе объекта.
Так что можете сделать так:
Код:
  MyClass = class
  public
    a: integer; 
  end;
Или переопределять ToString (пример переопределения есть в справке).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.09.2021, 22:21   #3
Кверт
Пользователь
 
Регистрация: 09.08.2021
Сообщений: 15
По умолчанию

public! всего лишь public!

Спасибо, BDA!
Кверт вне форума Ответить с цитированием
Старый 27.09.2021, 23:41   #4
Кверт
Пользователь
 
Регистрация: 09.08.2021
Сообщений: 15
По умолчанию

Вариант с public работает (без переопределения ToString).

И переопределять ToString компилятор разрешил, если только установлен public:
Код:
type
  MyClass = class
  public
    a: integer; 
    b: integer;
    function ToString: string; override;
    begin
      Result := $'({a},{b})';
    end;
  end;

begin
  var obj := new MyClass; 
  obj.a := 12;
  obj.b := 23;
  Println(obj.a, obj.b);   // выдает: 12 23
  writeln(obj);            // выдает: (12,23)
end.
Кверт вне форума Ответить с цитированием
Старый 28.09.2021, 15:45   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Сам метод ToString должен быть с модификатором доступа public.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать чтобы он выводил в консоль. Cryptic22 Общие вопросы .NET 1 24.11.2018 23:00
Как сделать так,чтобы он выводил только ответ на вопрос, без вводных данных? Настя1303 Паскаль, Turbo Pascal, PascalABC.NET 4 28.09.2018 02:05
Как сделать так чтобы пинг выводил результаты с разницей в одну мс? spruced C# (си шарп) 3 12.03.2017 19:47
Как сделать так, чтобы при наведении мышкой на объект, который находится под другим, этот объект выходил на первый план? Zaza7 HTML и CSS 3 17.01.2013 10:23
что нужно изменить в программе, чтобы он выводил все буквы в алфавитном порядке, которые встретились в файле хотя бы 1 раз?! [Алёнка] Паскаль, Turbo Pascal, PascalABC.NET 4 06.12.2011 04:04