【发布时间】:2015-03-05 14:19:46
【问题描述】:
在 Delphi 中我可以这样做:
type
TAnimal = class
Name: String;
constructor Create(const Name: String);
end;
TAnimalType = class of TAnimal;
TElephant = class(TAnimal);
TEmu = class(TAnimal);
THovercraft = class;
implementation
var
Zoo: TObjectList;
procedure PopulateZoo;
begin
Zoo := TObjectList.Create(True);
AddToZoo(TElephant, "Ellie");
AddToZoo(TEmu, "Erik");
AddToZoo(THovercraft, "Helen"); //Compiler error here
end;
procedure AddToZoo(AnimalType: TAnimalType; Name: String)
var
Animal: TAnimal;
begin
Animal := AnimalType.Create(Name);
Zoo.Add(Animal);
end;
代码编译失败,因为 THovercraft 没有从 TAnimal 继承。如果AddToZoo(THovercraft); 被删除,那么代码将被编译。运行它并调用 PopulateZoo 将创建一个包含 TElephant 实例和 TEmu 实例的列表。
如何在 C# 中创建这种行为?我想要的主要功能是
1) 编译器强制 AddToZoo 仅将 TAnimal 及其后代作为其第一个参数,并且
2) 在 AddToZoo 中我可以轻松调用 TAnimal 中声明的构造函数。
附注这段代码被简化以演示我的问题。
【问题讨论】:
-
向我们展示您已经拥有的 C# 代码(没有您要求的限制)。
-
C# 没有元类的概念,因此没有编译时方法可以实现完全相同。在 C# 中也无法使用元类进行实例化。所以没有像
AnimalType.Create这样的东西。顺便说一句,它需要一个虚拟构造函数。您应该停止尝试使用文字端口,而是使用 C# 提供的功能编写代码。 -
@DavidHeffernan “使用 C# 提供的功能编写代码” - 这就是我寻求帮助的原因。我不是要一个字面端口。
-
@cja C# 中没有元类。那么你需要一个不同的解决方案来解决你的问题。
-
@cja 我不知道你的问题是什么。
标签: c# delphi oop inheritance types