سؤال

أنا فقط أحاول التعرف على الوحدات المنفصلة لجعل الكود الخاص بي أكثر تغليفًا.أحاول ترتيب الإعلانات العامة/الخاصة لأساليبي، حتى أتمكن من الاتصال بها من الوحدات الأخرى التي تستخدم testunit.في هذا المثال أريد أن أفعل hellofromotherunit عامة ولكن stickletters خاص.

unit testunit;    

interface

uses
  Windows, Messages, Dialogs;    

implementation

function stickletters(a,b:string):string;
begin
  result:=a+b;
end;

procedure hellofromotherunit();
begin
 showmessage(stickletters('h','i'));
end;

end.

لا يبدو أنني أستطيع نسخ البنية الخاصة/العامة من الوحدات الأخرى كما في:

Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
هل كانت مفيدة؟

المحلول

يبدو أن هيكل الوحدة يشبه الأقسام العامة / الخاصة من الكائنات، فيمكنك أن تقول إنه Forerunner. لكن بناء الجملة مختلف.

يجب عليك فقط أن تعلن رأس الطريقة في قسم الواجهة، كما هو الحال في:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

واحد فقط من كل قسم مسموح به.

نصائح أخرى

الخاص والعام ينطبق فقط على الفصول الدراسية.

ما تريد القيام به هو وضع نسخة من إعلان hellofromotherunit في قسم الواجهة.ومع ذلك، لا تضع نسخة من إعلان Stickletter هناك.

أي شيء يظهر في قسم الواجهة يصبح عامًا بشكل فعال.أي شيء يقتصر على التنفيذ فهو خاص.

بالإضافة الى،

كل وحدة لديها اثنين من أجزاء متميزة. الواجهة والتنفيذ.

يحتوي قسم الواجهة على جميع التعريفات العامة (أنواع عناوين الإجراءات، الثوابت). يحتوي قسم التنفيذ على جميع تفاصيل التنفيذ.

عند استخدام وحدة، (باستخدام جملة الاستخدامات) يمكنك الوصول إلى التعريفات العامة لتلك الوحدة. هذا الوصول ليس متكررا، لذلك إذا كانت الوحدة تستخدم الواجهة وحدة B، والوحدة C تستخدم الوحدة A، فلن تحصل على الوصول إلى الوحدة B إلا إذا كنت تستخدمها صراحة.

يتمتع قسم التنفيذ بالوصول إلى الواجهة، إلى الوحدة المستخدمة في كلا الاستخدامات باستخدام الجمل (الواجهة والتنفيذ).

يتم تجميع واجهات الوحدات المستخدمة أولا قبل أن تواصل تجميع الباقي. هذا لديه ميزة يمكنك الحصول على تبعيات دائرية من داخل التنفيذ:

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

التي تجمع:

  • جرب واجهة A، فشلت حاجة ب
  • جرب واجهة ب، موافق!
  • جرب واجهة A، حسنا!
  • حاول التنفيذ A، حسنا!
  • حاول التنفيذ ب، حسنا!

تحتوي كل وحدة أيضا على قسم التهيئة (وإذا كان لديه قسم التهيئة، فقد يكون لها أيضا قسم الانتهاء.) يتم استخدام قسم التهيئة لتهيئة متغيرات الوحدة. يتم استخدام أقسام الانتهاء لتنظيف. عند استخدام هذه، من الحكمة عدم الاعتماد على تهيئة الوحدات الأخرى. فقط احتفظ بها بسيطة وقصيرة.

الوحدة هي أيضا مساحات الأسماء. مرفق ما يلي:

unit A;
interface
const foo = 1;

unit B;
interface
const foo = 2;

unit C;
interface
uses A, B;

const
  f1 = foo;
  f2 = A.foo;
  f3 = B.foo;

إذا تم تحديد معرف في وحدات متعددة الاستخدامات، فسيتم أخذ الوحدة الأخيرة الممكنة في قائمة الاستخدامات. لذلك F1 = 2. ولكن يمكنك بادئة مع اسم الوحدة (مساحة الاسم) لحل هذه المشكلة.

مع إدخال .NET، يسمح باستخدام مساحات الأسماء المتعددة الأجزاء التي تقدم مشاكل لطيفة أخرى:

unit foo;
interface
type
  rec1 = record
    baz : Boolean;
  end;
var
  bar : rec1;

unit foo.bar;
interface
var
  baz : Integer;

uses
  foo, foo.bar;    
begin
  foo.bar.baz := true;
  foo.bar.baz := 1;
end.  

// 1. Which these lines gives an error and why?
// 2. Does the result change if you write uses foo.bar, foo?

في هذه الحالة، لديك صراع. ولكن يتم حلها عن طريق إعطاء اسم مساحة الاسم أولوية أعلى. لذلك فشل الخط الأول.

ببساطة لا تعلن الطريقة في قسم الواجهة وسيتم الاحتفاظ بها خاصة.

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

function MyPrivateFunction():Boolean;
begin
  // blah blah
end;

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top