如何访问子类中的函数?

时间:2009-07-20 18:33:21

标签: delphi oop inheritance class

子类可以访问父类中的受保护函数,但父类无法访问子类中的受保护函数。

我希望将这两个类保持为私有。父类是一个表单,只使用一次实例。子类中的所有函数都是静态的,它继承自父类。

如何从父类访问子类中的非公共静态方法(在另一个单元中)?

修改

父类(第一单元):

interface

type
TParent = class
  public
    procedure Initialize;
  protected
    procedure Test; virtual;
end;

implementation

procedure TParent.Initialize;
begin
  Writeln('Initializing');
  Test;
end;

procedure TParent.Test;
begin

end;

儿童班(第二单元):

interface

uses
ParentClass;

type
TChild = class(TParent)
protected
  procedure Test;override;
end;

implementation

procedure TChild.Test;
begin
  Writeln('Test!');
end;

代码(第三单元):

var c:TParent;

begin
  try
    c := c.Create;
    c.Initialize;
    c.Free;
    Readln;
end;

输出只是“初始化”。我试图调试它,它没有到达子类。

5 个答案:

答案 0 :(得分:3)

您想要做的事情违反了继承中的Liskov Substitution原则。可能有更好的方法。你究竟想做什么?

编辑:

为什么不能从子类创建对象实例。您始终可以将其分配给父类类型的变量。这通常在工厂模式中完成。

答案 1 :(得分:3)

实际上有几种方法可以做到这一点,在您的父类中,创建您调用的虚拟方法,但这些方法不会执行任何操作。在子类中,重写这些方法。这些方法很容易受到保护,但它们必须存在于父级中。

type
  TParent = class
  protected
    procedure SpecialProcessing; virtual;
  public
    procedure DoWork;
  end;

  TChild = class(TParent)
  protected
    procedure SpecialProcessing; override;
  end;

procedure TParent.DoWork;
begin
  SpecialProcessing;
end;

procedure TParent.SpecialProcessing;
begin
  // does nothing, placeholder
end;

procedure TChild.SpecialProcessing;
begin
  // do special work here
end;

我故意没有制作TParent.SpeciallProcessing摘要。这可以做到,但只有当TParent永远不会直接创建,只有后代才会被创建。抽象方法是一种未实现的方法,但用作占位符,供以后的子项实现。

要创建实例,请使用以下命令:

var
  C : TParent;
begin
  // Create as a TChild, which is a TParent decendant
  C := TChild.Create;
  try
    C.DoWork;
  finally
    C.Free;
  end;
end;

答案 2 :(得分:2)

不可能这样做。在子类中使用非公共方法的全部目的是防止类(子类除外)能够访问它们。试图解决这个问题违反了基本的面向对象原则。

我会考虑重新考虑你的设计。

答案 3 :(得分:1)

对于已经回答的人,我可能会遗漏一些明显的东西。但我认为这只是实例化正确对象的问题。

如果对象是子类的实例,则父代码将调用子代码。

试试这个

var c:TChild;
begin
  c := TChild.Create;
  c.Initialize;
  c.Free;
end.

甚至

var c:TParent;
begin
  c := TChild.Create;
  c.Initialize;
  c.Free;
end.

答案 4 :(得分:0)

您可以通过在创建子类时使用父类注册子类,使用某种回调(父项上的cattr,以及定义它时的子项)来执行此操作。

但这很难做到。像其他人所说,考虑一种不同的模式。

我不是delphi编码器,但您可以在父类上设置公共静态变量,并从子类中的setup方法设置它。

这在某些情况下是有意义的(想要将消息传递到各种子类的类设置方法),但是可能有更好的方法来做你需要的事情。您可能希望更多地提出有关代码解决问题的问题。