GVKun编程网logo

理解 Delphi 的类(一) - 从结构谈起(delphi的所有类都是从什么类继承下来的)

13

在本文中,我们将带你了解理解Delphi的类(一)-从结构谈起在这篇文章中,我们将为您详细介绍理解Delphi的类(一)-从结构谈起的方方面面,并解答delphi的所有类都是从什么类继承下来的常见的疑

在本文中,我们将带你了解理解 Delphi 的类(一) - 从结构谈起在这篇文章中,我们将为您详细介绍理解 Delphi 的类(一) - 从结构谈起的方方面面,并解答delphi的所有类都是从什么类继承下来的常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的[DELPHI-码农]理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数、创建Delphi IoC.如何禁用Delphi的链接器删除未使用的类、理解 Delphi 的类 (九) - 关于类的向前声明、理解 Delphi 的类 (八) - 关于类的定义

本文目录一览:

理解 Delphi 的类(一) - 从结构谈起(delphi的所有类都是从什么类继承下来的)

理解 Delphi 的类(一) - 从结构谈起(delphi的所有类都是从什么类继承下来的)

总结

以上是小编为你收集整理的理解 Delphi 的类(一) - 从结构谈起全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

[DELPHI-码农]理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数

[DELPHI-码农]理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数

总结

以上是小编为你收集整理的[DELPHI-码农]理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

创建Delphi IoC.如何禁用Delphi的链接器删除未使用的类

创建Delphi IoC.如何禁用Delphi的链接器删除未使用的类

我在delphi中创建了一个IoC,能够自动注册任何具有IocSingletonAttribute的类.

AutoRegister如下所示.

procedure TIocContainer.AutoRegister;
var
  ctx: TRttiContext;
  rType: TRttiType;
  attr: TCustomAttribute;
  &Type: PTypeInfo;
begin
  ctx := TRttiContext.Create;
  for rType in ctx.GetTypes do
  Begin
    for attr in rType.GetAttributes do
    Begin
      if TypeInfo(IocSingletonAttribute) = attr.ClassInfo then
      Begin
        &Type := IocSingletonAttribute(attr).&Type;
        RegisterType(&Type,rType.Handle,True);
      End;
    End;
  End;
end;

然后我创建一个实现并将IocSingletonAttribute添加到它.看起来像这样

[IocSingleton(TypeInfo(IIocSingleton))]
TIocSingleton = class(TInterfacedobject,IIocSingleton)
  procedure DoSomeWork;
end;

所以,现在到程序的实际代码.如果我写下面的代码,IoC不起作用. AutoRegister过程没有选择TIocSingleton.

var
  Ioc: TIocContainer;  
  Singleton: IIocSingleton;  
begin  
  Ioc := TIocContainer.Create;
  try    
    Ioc.AutoRegister;
    Singleton := Ioc.Resolve<IIocSingleton>();
    Singleton.DoSomeWork;
  finally 
    Ioc.Free;
  end;
end.

但是,如果我编写下面的代码,一切都按预期工作.请注意我是如何声明TIocSingleton类并使用它的.

var
  Ioc: TIocContainer;  
  Singleton: IIocSingleton;  
  ASingleton: TIocSingleton;
begin  
  Ioc := TIocContainer.Create;
  ASingleton := TIocSingleton.Create;
  try    
    Ioc.AutoRegister;
    Singleton := Ioc.Resolve<IIocSingleton>();
    Singleton.DoSomeWork;
  finally 
    Singleton.Free;
    Ioc.Free;
  end;
end.

基于此,我假设Delphi的编译器链接器在第一个示例中删除了TIocSingleton,因为它从未在应用程序的任何部分中明确使用.所以我的问题是,是否可以为某个类转换编译器的“删除未使用的代码”功能?或者,如果我的问题不是链接器,任何人都可以阐明为什么第二个例子有效而不是第一个?

解决方法

将{$STRONGLINKTYPES ON}指令添加到.dpr.然后应该包括那些类型.但它肯定会炸毁您的应用程序,因为它不适用于单个类.

理解 Delphi 的类 (九) - 关于类的向前声明

理解 Delphi 的类 (九) - 关于类的向前声明

//例1: 这是正确的
  TClassA = class
    Field1: string;
    Field2: Integer;
  end;

  TClassB = class
    Field1: string;
    Field2: Integer;
    Field3: TClassA; {字段 Field3 的类型是刚刚新定义的 TClassA 类型}
  end;

 
 
 
 
 

 

 

  
  
//例2: 这是错误的, 这里有个顺序问题 TClassA = class Field1: string; Field2: Integer; Field3: TClassB; {字段 Field3 的类型是将要定义的 TClassB 类型} end; TClassB = class Field1: string; Field2: Integer; end;
//例3: 解决方案 - 向前声明 TClassB = class; {向前声明} TClassA = class Field1: string; Field2: Integer; Field3: TClassB; end; TClassB = class Field1: string; Field2: Integer; end;

理解 Delphi 的类 (八) - 关于类的定义

理解 Delphi 的类 (八) - 关于类的定义

//标准语法
  TMyClass1 = class(TObject)

  end;

 
 
 
 
 

 

 

  
  
//如果是继承自 TObject 可以省略 TMyClass2 = class end;
//可以实现多个接口; 实现接口时经常用到 TInterfacedObject 类, 它实现了接口的默认方法 TMyClass3 = class(TInterfacedObject, Interface1, Interface2) end;
//现在 TMyClass4 相当于 TObject 的别名 TMyClass4 = class(TObject);
//用 class abstract 说明抽象类, 但内部必须有抽象方法, 才是真正的抽象类. TMyClass5 = class abstract(TObject) procedure Proc; virtual; abstract; end;
//用 class sealed 定义不可继承的类 TMyClass6 = class sealed(TObject) //... end;
//这是定义了一个 TObject 类型的指针; TMyClass 称作 TObject 的类引用或元类 TMyClass = class of TObject;
//类中数据成员的排列顺序一般是: 字段、方法、属性
//访问权限区域的顺序一般是: 无限制区(默认 published) private protected public published

关于理解 Delphi 的类(一) - 从结构谈起delphi的所有类都是从什么类继承下来的的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于[DELPHI-码农]理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数、创建Delphi IoC.如何禁用Delphi的链接器删除未使用的类、理解 Delphi 的类 (九) - 关于类的向前声明、理解 Delphi 的类 (八) - 关于类的定义等相关内容,可以在本站寻找。

本文标签: