有关OP中类的两个问题,请指点?(30分)

  • 主题发起人 主题发起人 Archerfl
  • 开始时间 开始时间
A

Archerfl

Unregistered / Unconfirmed
GUEST, unregistred user!
1.在Delphi中如果像在C++那样禁止程序员创建类的对象?
在C++中
class MyClass
{
private:
MyClass() {}
};
这样就可以达到禁止程序员创建类的对象的目的。
那么,在Delphi中,如何做呢?
2.在Delphi中有关子类方法隐藏父类同名方法的问题?
type
A = class
public
procedure OP;
end;

B = class(A)
private
procedure OP;
end;
这样定义后,我认为类B中的OP过程应该隐藏了来自于父类A中的同名过程。
但是,我们仍可以调用到OP过程,var m: B
m.OP;但这时OP的作用域
已经是private啦!而在C++中是如我所述的。请问这是为什么?
 
delphi 里有:
constructors 构造函数
 
C++的不合理就在于此。
VCL对象的的成员封装只能逐渐放宽,不能比父类更严格。
这和现实世界比较吻合,也很合理。
 
2.
Delphi 回有警告错误
应该

type
A = class
public
procedure OP;
end;

B = class(A)
private
procedure OP;override;
end;

第一提我不太明白,详细说说
 
to 老人家
如在C++中 MyClass m;这时编译器就会报错,不会让你在堆上创建这个对象,那么在
Delphi中如何做到这一点儿呢?
 
1.用抽象方法
如类中声明为
procedure myvirtualmothed
virtual
abstract;
 
Delphi 好像没这个功能
你要这个功能干什么用
 
没什么,只是在学C++的时候,想顺便比照一下OP语言!
 
第一.在Delphi中是一樣的,構造為private是,你便不能吊用它。不過
B = class(A)
private
constructor Create(AOwner: TComponent);
end;
A還有構造函數public,protected Create(B需要override),那麼B.Create(Component)將調
用A.Create(Component);
第二.隱藏不等於沒有。把它隱藏起來,還可以在使用它就是這樣。但是
private的方法是繼承不了的不管是Delphi,C++ 還是java。在C++中可以那
樣寫,你應該確定,掉用的是不是private的方法。如果是你就把C++
幹掉!

 
To Richard3000:
您说的第一中,我曾经这样试过,不过好像不行,Delphi的编译器仍然允许通过。
对于您提到的第二,我没有看明白,请您写清楚一些,谢!
 
編譯器通過是這樣的.
B = class(A)
private
constructor Create(AOwner: TComponent);
end;
如果A或者A的祖先也有一個一個構造函數而且B能夠繼承(public,protected),
當你使用B.Create(..)的時候,實際上調用的是和B血緣關係最近的Create;
而B的Create沒有被調用.
第一和第二都是這樣.
b.op;調用的還是A.oP;
我這裡有個簡單的例子.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.Create(Application);
Form2.Show;
Form2.f;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Application.CreateForm(TForm3, Form3);
Form3.Show;
Form3.f;
end;

end.


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure f;
end;

TForm3=class(TForm2)
private
procedure f;
public
//procedure f;
end;

var
Form2: TForm2;
Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.f;
begin
Caption:='TForm3.f';
end;

procedure TForm2.f;
begin
Caption:='TForm2.f';
end;

end.


program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
 
多人接受答案了。
 
后退
顶部