zoukankan      html  css  js  c++  java
  • Delphi 之Inherited详解


    inherited就是调用祖先类的函数,如果不带参数就是默认调用同名函数
    如果带参数则表明子类中的函数个数可能比祖先类要多取其中的几个参数传过去
    例如
    祖先类有个函数 Create(AName:string);
    子类有个函数 Create(AName:string;AComponent:TObject);override;
    那么子类的Create函数内就可以这样调用祖先类:
    procedure TAClass.Create(AName:string;AComponent:TObject);
    begin
    Inherited Create(AName);
    end;

     

     
     
    Inherited
    Keyword
    Used to call the parent class constructor or destructor method
    1   Create;
      begin
        Inherited;  // Always call at the start of a constructor
        ...
      end;
    2   Create(arguments);
      begin
        Inherited Create(arguments);  // Always call at the start of a constructor
        ...
      end;
    3   Destroy;
      begin
        ...
        Inherited;  // Always call at the end of a destructor
      end;
     
    Description
    The Inherited keyword is used to call the parent constructor or destructor method, as appropriate, for the current class. 
     
    It is called at the start of a constructor, and at the end of a desctructor. It is not mandatory, but recommended as good practice. 
     
    Without parameters, Inherited calls the same named method the parent class, with the same parameters. 
     
    You can call a different parent method, if appropriate.
     
    Related commands
    Class   Starts the declaration of a type of object class
    Constructor   Defines the method used to create an object from a class
    Destructor   Defines the method used to destroy an object
    Function   Defines a subroutine that returns a value
    Object   Allows a subroutine data type to refer to an object method
    Overload   Allows 2 or more routines to have the same name
    Override   Defines a method that replaces a virtual parent class method
    Procedure   Defines a subroutine that does not return a value
     
    Example code : Examples of Inherited with and without explicit parent method names
    // Full Unit code.
    // -----------------------------------------------------------
    // You must store this code in a unit called Unit1 with a form
    // called Form1 that has an OnCreate event called FormCreate.

    unit Unit1;

    interface

    uses
      Forms, Dialogs, Classes, Controls, StdCtrls;

    type
      // Define a parent class, base on TObject by default
      TFruit = class
      public
        name   : string;
        Constructor Create; overload;   // This constructor uses defaults
        Constructor Create(name : string); overload;
      end;

      // Define a descendant types
      TApple = class(TFruit)
      public
        diameter : Integer;
      published
        Constructor Create(name : string; diameter : Integer);
      end;

      // The class for the form used by this unit
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      end;

    var
      Form1: TForm1;

    implementation
    {$R *.dfm} // Include form definitions

    // Create a fruit object - parameterless version
    constructor TFruit.Create;
    begin
      // Execute the parent (TObject) constructor first
      Inherited;  // Call the parent Create method

      // Now set a default fruit name
      self.name := 'Fruit';
    end;

    // Create a fruit object - parameterised version
    constructor TFruit.Create(name: string);
    begin
      // Execute the parent constructor first
      Inherited Create;  // Call the parent Create method

      // And save the fruit name
      self.name := name;
    end;

    // Create an apple object
    constructor TApple.Create(name: string; diameter : Integer);
    begin
      // Execute the parent (TFruit) constructor first
      Inherited Create(name);  // Call the parent method

      // Now save the passed apple diameter
      self.diameter := diameter;
    end;

    // Main line code
    procedure TForm1.FormCreate(Sender: TObject);
    var
      fruit  : TFruit;
      banana : TFruit;
      apple  : TApple;

    begin
      // Create 3 different fruit objects
      fruit  := TFruit.Create;
      banana := TFruit.Create('Banana');
      apple  := TApple.Create('Pink Lady', 12);

      // See which of our objects are fruits
      if fruit  Is TFruit then ShowMessage(fruit.name  +' is a fruit');
      if banana Is TFruit then ShowMessage(banana.name +' is a fruit');
      if apple  Is TFruit then ShowMessage(apple.name  +' is a fruit');

      // See which objects are apples
      if fruit  Is TApple then ShowMessage(fruit.name   +' is an apple');
      if banana Is TApple then ShowMessage(banana.name  +' is an apple');
      if apple  Is TApple then ShowMessage(apple.name   +' is an apple');
    end;
    end.
       Fruit is a fruit
       Banana is a fruit
       Pink Lady is a fruit
       Pink Lady is an apple


  • 相关阅读:
    Django学习案例一(blog):四. 使用Admin
    Django学习案例一(blog):三. 模型生成数据
    Django学习案例一(blog):二. 连接数据库
    连接Xively云
    undefined reference to `_sbrk', `_write', `_lseek', `_read'
    Android manifest
    关于android socket出现at java.net.DatagramSocket java.net.BindException at libcore.io.IoBridge.bind(IoBridge.java:89)等waring
    virtual box Failed to load unit ""pgm" 的error
    Lwip lwip_recvfrom函数一个数据包不能分多次读取。
    获取Window下的文件缩略图
  • 原文地址:https://www.cnblogs.com/wanqian/p/3156325.html
Copyright © 2011-2022 走看看