Единицы в Delphi такие же, как классы в других языках?

Мне нужно написать код на Delphi, но у меня нет опыта работы с Delphi. Я видел людей, пишущих какой-то код, известный как unit1 или же unit2 и импортировать его, используя код внутри них. Итак, я могу увидеть блок как класс в Java или C#?

3 ответа

Решение

Нет. Единица - это файл исходного кода в Delphi. По сути, вы можете думать об этом как о пространстве имен, область действия которого точно такая же, как у текущего файла.

Внутри модуля вы можете определять классы с синтаксисом определения типа. Это выглядит так:

type
  TMyClass = class(TParentClass)
  private
    //private members go here
  protected
    //protected members go here
  public
    //public members go here
  end;

Любые методы объявляются ниже объявления типа, а не встроенного, что облегчает чтение кода, потому что вы можете сразу увидеть состав класса вместо того, чтобы разбираться с его реализацией.

Кроме того, каждый модуль имеет два основных раздела, называемых интерфейсом и реализацией. Объявление типа может быть размещено в любом разделе, но код реализации недопустим в интерфейсе. Это учитывает концепцию языка, аналогичную общедоступным и закрытым классам Java или C#: любой тип, объявленный в интерфейсе, виден другим модулям, которые используют этот модуль ("public"), в то время как любой тип, объявленный в реализации, виден только внутри одного и того же модуля.

Чтобы добавить к ответу Мейсона - общая структура юнитов выглядит примерно так:

Unit UnitName;    
  interface
    //forward declaration of classes, methods, and variables)
    uses 
      //list of imported dependencies needed to satisfy interface declarations
      Windows, Messages, Classes;
    const 
      // global constants
      THE_NUMBER_THREE = 3;
    type // declaration and definition of classes, type aliases, etc 
      IDoSomething = Interface(IInterface)
        function GetIsFoo : Boolean;
        property isFoo : Boolean read GetIsFoo;
      end;
      TMyArray = Array [1..5] of double;
      TMyClass = Class(TObject)
        //class definition
        procedure DoThis(args : someType);
      end;
      TAnotherClass = Class(TSomethingElse)
        //class definition
      end;        
    //(global methods)
    function DoSomething(arg : Type) : returnType;        
    var  //global variables
      someGlobal : boolean;      
  implementation
    uses
      //list of imported dependencies needed to satisfy implementation
    const
      //global constants with unit scope (visible to units importing this one)
    type
      //same as above, only visible within this or importing units
    var
      //global variables with unit scope (visible to units importing this one) 
    procedure UnitProc(args:someType)
    begin
      //global method with unit scope, visible within this or importing units
      //note no forward declaration!
    end;       
    procedure TMyClass.DoThis(args : someType)
    begin
      //implement interface declarations
    end;
    function DoSomething(arg : Type) : returnType;    
    begin
      // do something
    end;
  initialization
    //global code - runs at application start 
  finalization
    //global code - runs at application end
end. // end of unit

Очевидно, что каждому блоку не нужны все эти разделы, но я думаю, что это все возможные разделы, которые могут быть включены. Мне потребовалось некоторое время, чтобы понять все это, когда я впервые зашел в Delphi, и я, вероятно, преуспел бы с такой картой, поэтому я предоставляю ее на случай, если она будет полезна.

Внутри модуля Delphi или библиотеки C++ Builder вы можете создавать более одного класса одновременно. В средах разработки для JAVA часто используется один класс для одного файла, он отличается от Delphi или C++ Builder, но вы можете сделать это также для Delphi или C++ Builder.

Занятия на каждом языке имеют свои особенности. Можно думать в ПОО для всех одинаково, но реализовать это отличается.

Другие вопросы по тегам