主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2004.02.02;
下载:[xml.tar.bz2];

向下

创建当前类的变量。 找到类似的分支


tria   (2004-01-21 14:29) [0]

问题如下。 有一个层次结构:
TBaseClass =类;
TClass1 =类(TBaseClass);
TClass2 =类(TBaseClass1);
TClass11 =类(TBaseClass);

这只猫有一个程序。 传递的类变量:
过程Proc1(p:TBaseClass);
var p1:TBaseClass;
开始
p1:= TBaseClass.Create;
...还有其他...
结束;

变量p可以是以上任何类型(TClass1,TClass2,TClass11)。
任务:创建与实际传递的参数相同类型的p1。



Skier   (2004-01-21 14:32) [1]

使用元类。



Тимохов   (2004-01-21 14:33) [2]

p.ClassType.Create;



tria   (2004-01-21 14:34) [3]

老实说,我不知道这是什么。



Тимохов   (2004-01-21 14:34) [4]

是的,这仍然取决于您的外观。



tria   (2004-01-21 14:36) [5]

谢谢Timokhov。



Тимохов   (2004-01-21 14:36) [6]


>老实说,我不知道这是什么。

如果您在谈论[2],请使用F1。



Тимохов   (2004-01-21 14:48) [7]

作者
请注意Timokhov©(21.01.04 14:34)[4]。
如果要在每个类中创建Create构造函数,请在基类中使其虚拟化,并在后代中重写。

总的来说,我有点不对:
您需要像TBaseClasses(p.ClassType).Create这样编写,其中TBaseClasses = TBaseClass的类。 否则,将在TObject上调用Create,并且根本不会调用您的create。



pasha_golub   (2004-01-21 15:02) [8]

2Timohov
原则上,Skier谈到了这一点。



Тимохов   (2004-01-21 15:04) [9]

pasha_golub©(21.01.04 15:02)[8]
仅仅是Skaer所说的非常聪明的话,每个人都无法理解(甚至对我来说也是:))))
我相信他有这个想法。



pasha_golub   (2004-01-21 15:21) [10]

2Timochov©(21.01.04 15:04)[9]
那是肯定的。 :-)这就是他和主人的原因。



Юрий Зотов   (2004-01-21 16:29) [11]

> tria©(21.01.04 14:29)

如果没有聪明的话,更具体地说,那就是。

类型
TBaseClass = class
...
构造函数Create(...); 病毒性的
...
结束;

TClassOfBaseClass = TBaseClass的类;

TClass1 =类(TBaseClass)
...
结束;

TClass2 =类(TBaseClass1)
...
结束;

等等

过程Proc1( RealBaseClass:TClassOfBaseClass);
VAR
p1:TBaseClass;
开始
p1:= RealBaseClass创建(...);
...
结束;



Тимохов   (2004-01-21 16:34) [12]

Yuri Zotov©(21.01.04 16:29)[11]

1。 他不需要过程Proc1(RealBaseClass:TClassOfBaseClass),但是不需要过程Proc1(RealBaseClass:TBaseClass),这是另一回事。
2。 他完全没有说出关于设计师的任何事情-也许是专职TOBject。对他来说创造就足够了,那么您就不需要虚拟的了



Юрий Зотов   (2004-01-21 16:45) [13]

> Timokhov©(21.01.04 16:34)[12]

>调解人是不同的东西。

不一样 但是ClassType尚未被取消。 我认为,我们应该以与最初制定这项任务的书相同的方式来考虑解决在撒哈拉沙漠捕获驯狮的问题的解决方案。

> 2。 关于设计师,他什么都没说-也许他
>全职TOBject.Create就足够了,然后没有虚拟

IMVHO在这里,您从根本上是非常错误的。 使用静态构造函数,将始终创建同一类的对象-在过程本身中声明的对象。 TBaseClass,一般而言。



Тимохов   (2004-01-21 17:03) [14]


> IMVHO,您的力量非常强大,非常基础
>您误会了。 使用静态构造函数,将始终创建它
>同一类的对象-已声明的对象
>在过程本身中。 一般而言,TBaseClass。


也许检查?

类型
tcc1 = tc1的类;
tc1 =类(tobject)
程序显示; 虚拟
结束;
tc2 =类(tc1)
程序显示; 覆盖
结束;

程序tc1.show;
开始
showmessage(“



Тимохов   (2004-01-21 17:05) [15]


>> Timokhov©(21.01.04 16:34)[12]
>
quoted1 >>认为危害者是不同的东西。
>
>不同。 但是ClassType尚未被取消。 我相信解决方案
>在撒哈拉沙漠中捉住狮子的任务应该是我们的任务
>以与本书中相同的方式考虑
>是第一个制定的。


也很难同意这一点。 问题是有一个对象,您需要使其成为同一类的克隆。

没事,但是作者提出了不同的要求。



Тимохов   (2004-01-21 17:21) [16]

尤里·佐托夫!
回应[14]。 也许我误会了什么? 老实说我很有趣...



Юрий Зотов   (2004-01-21 17:29) [17]

> Timokhov©(21.01.04 17:21)[16]

为什么不明白呢? 取决于实现。 如果使用元类,则为是,否则使用静态构造函数将始终创建相同的类。



Тимохов   (2004-01-21 17:38) [18]

不太清楚。

在14中给出了一个示例,该示例似乎与您对13的反对与我的短语“关于构造函数,他根本没有说什么-也许他有足够的TOBject.Create,因此不需要虚拟”相矛盾。 您说我从根本上错了,也许仍然从根本上错了,一点也不错吗? :)))

据此,在第一个答案之一中提出的实现中的问题的作者不必为设计人员做虚拟的。

是的,通常,在您的11示例中,不需要进行虚拟-如果没有它,它将可以正常工作。



Skier   (2004-01-21 17:40) [19]

> Timokhov©(21.01.04 17:38)[18]
而你检查不 虚拟 ...通过ClassName ...



Тимохов   (2004-01-21 17:44) [20]

滑雪者©(21.01.04 17:40)[19]
Всеработает

我闻到这是什么意思,我们的误解是什么。
如果BaseClass的每个类后代都需要自己的构造函数,则需要编写TBaseClass.crate;。 虚拟 如果所有后代都可以绕过TBaseClass.crate构造函数,则不需要virtual。



Тимохов   (2004-01-21 17:45) [21]

T.O. 这一切都取决于原始任务...



Skier   (2004-01-21 17:48) [22]


> T.O. 这一切都取决于原始任务...

这完全取决于进入类引用的内容。



Тимохов   (2004-01-21 17:49) [23]


>这一切都取决于进入类引用的内容。

注意不明白:(((



Skier   (2004-01-21 17:50) [24]


>注意不明白:(((

可惜......



Тимохов   (2004-01-21 17:52) [25]

滑雪者©(21.01.04 17:50)[24]
这已经超出了...:(((
在我所说的一切中,不幸的是,我是对的。



tria   (2004-01-21 18:18) [26]

>滑雪者
我可以再重复一遍吗? 然后我接受了它,弄清楚它真的很疼吗?



tria   (2004-01-21 18:24) [27]

Timokhov引用的示例有效,ClassName返回tc2。 不幸的是,我看不到陷阱。
对于所有类,我仍然只有一个构造函数,但将来可能会有所不同。 选中-调用所需类的构造函数。



Тимохов   (2004-01-21 18:26) [28]

tria©(21.01.04 18:24)[27]
如果您可能需要其他构造函数(即后代需要您自己的构造函数),请听Yuri Zotov的讲解。 Prichi在TBaseClass构造函数中创建; 虚拟并创建诸如TBaseClasses(p.ClassType).Create的对象。



tria   (2004-01-21 18:30) [29]

Timokhov
我懂了
已检查-代码已花了,添加了带有虚拟指令的构造函数,并将其阻止在继承人中。 创建时,将调用tc2类的构造函数。 因此,我认为您的代码有效。



Тимохов   (2004-01-21 18:38) [30]

这里表达的所有想法都是可行的-这完全取决于您的需要。

从方法论的角度来看,最右边(在正确的意义上)是Yuri Zotov-始终写入虚拟构造函数,一切都会正常。



Тимохов   (2004-01-21 18:55) [31]


>已检查-代码已完成,并添加了带有指令的构造函数
>虚拟,在后继者中受阻。 创建时,构造函数被调用
>类tc2。 因此,我认为您的代码有效。

我要补充一点,创建某个类的对象的事实与调用此类的构造函数的事实是不一样的。
即 可以创建一个类对象,但不调用其构造函数。 同时,除了跳过对所需构造函数的调用之外,没有其他错误。

您可以看到一个例子

类型
tcc1 = tc1的类;
tc1 =类(tobject)
构造函数create();
结束;
tc2 =类(tc1)
构造函数create();
结束;

构造函数tc1.create();
开始
showmessage(“ tc1构造函数,类名=” +类名);
结束;

构造函数tc2.create();
开始
showmessage(“ tc2构造函数,类名=” +类名);
结束;

程序p(o:tcc1);
VAR
oo:tc1;
开始
oo:= o.create();
结束;

过程TForm1.Button10Click(Sender:TObject);
开始
p(tc1); //创建类Tc1被称为const。 tc1.create。
p(tc2); //创建类Tc2被称为const。 tc1.create。
结束;

总的来说,我想回到听尤里·佐托夫(Yuri Zotov)的建议。 我从编写程序的方法论的角度重复一遍,他是正确的。



tria   (2004-01-21 19:07) [32]

实际上,最后一个示例是解决该问题的最简单方法...



Тимохов   (2004-01-21 19:13) [33]


>实际上,最后一个示例是最简单的解决方案
>任务...

您是说[31]中的示例吗?
仍然写得更好:)虚拟的:)))生活会更加平静...



tria   (2004-01-21 19:19) [34]

好吧,开个玩笑...
我将为自己总结:我没有意识到问题的全部深度,但是我知道如何解决我的问题以及该解决方案可能导致的后果。
再次感谢大家,我正在消遣一个非常愉快的消遣-踢足球。



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2004.02.02;
下载:[xml.tar.bz2];

楼上









内存:0.68 MB
时间:0.061 c
6-2267年
favorit_
2003-11-28 00:09
2004.02.02
更改IE设置


14-2321年
Teren
2004-01-09 00:15
2004.02.02
喜欢的电影


14-2294年
INTELL
2004-01-12 16:34
2004.02.02
Меня запарил Explorer!


1-2066年
Nab_off
2004-01-20 13:07
2004.02.02
状态栏


3-2043年
Niker
2004-01-05 17:49
2004.02.02
如何使用不完整的数据库查询执行快速搜索?





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский