Нужно I для помещения слов перегрузки или переопределения после объявления конструктора в производном классе?

Первый этап - установить ссылку на Microsoft Word в редакторе vb в Excel. Затем вы можете открыть текстовый документ следующим образом:

Dim wd as new Word.application
dim doc as word.document
set doc = wd.documents.open("path and mame of word document")

«Работа с таблицей выглядит так:« Предположим, цель - это указатель на ячейку Excel

Dim t As Word.Table
Set t = doc.Tables(1)
t.Cell(3, 2).Range.Copy    'this copies the cell at row 3, column 2
target.PasteSpecial xlPasteValues

.

7
задан gabr 11 December 2008 в 19:42
поделиться

4 ответа

Насколько я знаю, здесь существует два отдельных вопроса:

Удостоверяясь вызовы конструктора дочернего класса конструктор базового класса

Необходимо будет явно вызвать конструктора базового класса:

constructor TMinMatrix.Create(Rows, Cols: Byte);
begin
   inherited;
   //...
end;

Удостоверяясь конструктор дочернего класса переопределяет конструктора базового класса

Необходимо будет также сделать конструктора дочернего класса override, и конструктор базового класса virtual, для проверки компилятор видит отношение между двумя. Если Вы не сделаете этого, то компилятор, вероятно, предупредит Вас, что конструктор TMinMatrix "скрывает" конструктора TMATRIX. Так, правильный код был бы:

type
TMatrix = class
    protected
      //...
    public
      constructor Create(Rows, Cols: Byte); virtual;    // <-- Added "virtual" here
      //...
type
  TMinMatrix = class(TMatrix)
    private
      //...
    public
      constructor Create(Rows, Cols: Byte); override;   // <-- Added "override" here
      constructor CreateCopy(var that: TMinMatrix);
      destructor Destroy; override;                     // <-- Also make the destructor "override"!
  end;

Обратите внимание, что необходимо также сделать деструктор override.

Начинание конструктора с различными параметрами

Обратите внимание, что можно только переопределить конструктора с тем же списком параметров. Если для дочернего класса нужен конструктор с различными параметрами, и Вы хотите препятствовать тому, чтобы конструкторы базового класса были вызваны непосредственно, необходимо записать:

type
TMyMatrix = class(TMatrix)
//...
public
  constructor Create(Rows, Cols, InitialValue: Byte); reintroduce; virtual;
//...
end

implementation

constructor TMyMatrix.Create(Rows, Cols, InitialValue: Byte);
begin
  inherited Create(Rows, Cols);   // <-- Explicitly give parameters here
  //...
end;

Я надеюсь, что это делает вещи более ясными... Удачи!

14
ответ дан 6 December 2019 в 08:17
поделиться

Вам нужна перегрузка для обоих конструкторов, если у них есть то же имя.

type
  TMatrix = class
  protected
    //...
  public
    constructor Create(Rows, Cols: Byte);
    //...
type
  TMinMatrix = class(TMatrix)
  public
    constructor Create(Rows, Cols: Byte); overload;
    constructor Create(var that: TMinMatrix); overload;
  end;

Это - хорошая практика для вызова наследованного конструктора.

constructor TMinMatrix.Create(Rows, Cols: Byte);
begin
   inherited Create(Rows, Cols); // Need to call the full name if the parameters are changed.
   //...
end;
2
ответ дан 6 December 2019 в 08:17
поделиться

Необходимо назвать унаследованный метод явно; Delphi не сделает этого для Вас. Это дизайном, потому что существуют случаи, где Вы работаете с виртуальными методами, например, когда Вы не хотите вызывать наследованное поведение.

Кроме того, как персональное предпочтение, мне нравится выписывать наследованный вызов полностью. (наследованный Создают (строки, Седла); в противоположность просто наследованному; по одной простой причине: это делает что намного легче пересечь код. Если Вам выписали вызов метода, Вы можете щелчок управления он и добираться до методов предшествования.

3
ответ дан 6 December 2019 в 08:17
поделиться

Перегрузка, говорит компилятору, что метод имеет то же имя с различными параметрами.

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

Повторно введите, скроет виртуальный или динамический метод, объявленный в базовом классе.

Определениями тезисов является из книги Ray Lischner {Delphi вкратце}

type
  TFirst = class
  private
    FValue: string;
    FNumber: Integer;
  public
    constructor Create(AValue: string; ANumber: integer);

    property MyValue: string read FValue write FValue;
    property MyNumber: Integer read Fnumber write FNumber; 
  end;

  TSecond = class(TFirst)
  public
    constructor Create(AValue: string; ANumber: Integer);
  end;

constructor TFirst.Create(AValue: string; ANumber: integer);
begin
  MyValue := AValue;
  MyNumber := ANumber;
end;

{ TSecond }

constructor TSecond.Create(AValue: string; ANumber: Integer);
begin
  inherited;
end;

TSecond, как это объявляется, назовет создавание TFirst без наследованного, участники TSecond остаются пустыми.

3
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: