Проблема с общим классом - PullRequest
0 голосов
/ 24 сентября 2011

Прежде всего, простите за заголовок, но очень сложно объяснить хорошее в двух словах.Тогда иль проблема в этом.У меня есть два класса (объекта): Tclass1 и Tclass2.Они независимы от них, и оба класса (объекты) вызывают третий класс (объект): например, Tclass3.Как я могу поделиться информацией о Tclass3 между Tclass1 и Tclass2?

Попытайтесь объяснить лучше на примере:

Tclass1 = class
private
  class3: Tclass3;
public
  property err: Tclass3 read class3 write class3;
  ...
end;

Tclass2 = class
private
  class3: Tclass3;
public
  property err: Tclass3 read class3 write class3;
  ...
end;

Tclass3 = class
private
  icode: word;
public
  property code: word read icode;
  ...
end;

, а основная программа:

var
  class1: Tclass1;
  class2: Tclass2;
begin
  class1 := Tclass1.create;
  try
    class2 := Tclass2.create;
    try
      class2.err := class1.err;  // <--- problem is here
         ...
         ... // processing...
         ... 
      class1.err := class2.err;  // <--- problem is here
      writeln (class1.err.code)      
    finally
      class2.free; 
    end;
  finally
    class1.free;
  end;
end;

, конечно, в Tclass1 и Tclass2 я вызываю метод create класса Tclass3и экземпляр этого.Теперь, когда я его запускаю, сделайте исключение, но я не могу его прочитать, потому что консоль быстро закрывается.Я применил к классу (объекту) те же правила для переменной;Infact если я использую переменную, чтобы все это, все работает нормально.Не возможно решить то же самое с классом (объектом)?Еще раз большое спасибо.

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

Ваш вопрос немного расплывчатый. Но позвольте мне попытаться понять.

  1. У вас есть два класса, которым принадлежит экземпляр третьего класса. (Они отвечают за создание и удаление класса).
  2. Вы хотите разделить информацию (но не сам класс) между двумя классами.

В этом случае вы можете создать метод Assign, который копирует поля одного объекта в другой:

Tclass3 = class
private
  icode: word;
public
  procedure Assign(const AValue: TClass3); virtual;

  property code: word read icode;
  ...
end;

procedure TClass3.Assign(const AValue: TClass3);
begin
  Assert(AValue<>nil);
  icode := AValue.icode;
end;

Если вы хотите совместно использовать один и тот же объект между ними, вам необходимо решить, какой из классов владеет объектом. (Или вы могли бы даже создать отдельного владельца). Но лучшим решением будет использование интерфейса с TClass3, чтобы вы могли воспользоваться подсчетом ссылок.

1 голос
/ 25 сентября 2011

"Теперь, когда я запускаю его, сделайте исключение, но я не могу его прочитать, потому что консоль быстро закрывается. "

Вы можете решить эту проблему следующим образом:

В файле .dpr вашего консольного приложения у вас, вероятно, есть что-то вроде этого:

begin
  try
    // do stuff
  except
    on e:Exception do
      writeln(e.message);
  end;
end.

Просто измените это на:

begin
  try
    // do stuff
  except
    on e:Exception do
    begin
      // show error, and wait for user to press a key
      writeln(e.message);
      readln;
    end;
  end;
end.

Это должно немного облегчить отладку.

...