متى يجب علي استخدام أنواع السجلات المحسنة في دلفي بدلاً من الفئات؟

StackOverflow https://stackoverflow.com/questions/843387

سؤال

دلفي 2006 قدم إمكانات جديدة للسجلات، مما يجعلها أكثر "توجهًا نحو الكائنات".

في أي الحالات يكون نوع السجل أكثر ملاءمة للتصميم من نوع الفئة؟ما هي الميزة التي يتمتع بها لاستخدام أنواع السجلات هذه؟

هل كانت مفيدة؟

المحلول

لديك سجلات والأشياء والطبقات.

هي

والوثائق المتاحة منذ توربو باسكال 1. فهي خفيفة الوزن، القادر على وجود الخصائص والأساليب، لكنها لا تدعم الميراث، وهناك بعض القضايا مع وظائف التي ترجع السجلات. إذا كانت هذه السجلات لديها وسائل وهذا يعطي في بعض الأحيان أخطاء الداخلية:

type
  TRec = record 
    function Method1: Integer;
  end;

function Func: TRec;


procedure Test;
var
  x : TRec;

begin
  Func.Method1; // Sometimes crashes the compiler
  // Circumvention:
  x := Func;
  x.Method1; // Works
end;

ويتم إدخال كائنات مع توربو باسكال 5 إذا أنا الصحيح. وبعد ذلك قدمت وسيلة للOO مع باسكال. هي أكثر أو أقل إهمال أنهم مع الأخذ دلفي، ولكن لا يزال بإمكانك استخدامها. يمكن كائنات تنفيذ الواجهات.

ويتم إدخال فئات مع دلفي 1 وأكثر تنوعا. انهم تنفيذ واجهات والدعم الميراث. ولكن كل متغير فئة هو مؤشر مخفي. وهذا يعني أن الطبقات تحتاج إلى إنشاؤها على الكومة. لحسن الحظ هذه العملية مخفيا في الغالب.

وفيما يلي جدول مع الاختلافات بين الدول الثلاث. وأضاف أنا واجهة لاستكمالها.

                  |Class|Object|Record|Interface|
------------------|-----------------------------|
Are pointers?     |  y  |  n   |  n   |    y    |
Inheritance       |  y  |  y   |  n   |    y    |
Helpers           |  y  |  n   |  y   |    n    |
Impl. Interface   |  y  |  y   |  n   |    -    |
Visibility        |  y  |  y   |  n   |    n    |
Method            |  y  |  y   |  y   |    y    |
Fields            |  y  |  y   |  y   |    n    | 
Properties        |  y  |  y   |  y   |    y    |
Consts            |  y  |  y   |  y   |    n    |
Types             |  y  |  y   |  y   |    n    |
Variants          |  n  |  n   |  y   |    n    |
Virtual           |  y  |  n   |  y   |    -    |
------------------|-----------------------------|

نصائح أخرى

أعتقد أن هذه الميزات كانت متوفرة أيضًا في دلفي 8 و2005.

المبدأ التوجيهي الرئيسي:إذا كنت في شك، استخدم فئة.

بالنسبة للباقي عليك أن تفهم الفرق الرئيسي:تُستخدم كائنات الفئة دائمًا من خلال مرجع، ويتم إنشاؤها عن طريق استدعاء المُنشئ.

إدارة الذاكرة وتخصيصها للسجلات هي نفسها بالنسبة للأنواع الأساسية (أي عدد صحيح ومزدوج).وهذا يعني أنه يتم تمريرها إلى الأساليب حسب القيمة (ما لم يتم استخدام var).كما أنك لا تحتاج إلى تحرير السجلات، وهذا هو السبب في أنها تدعم التحميل الزائد للمشغل.لكن لا يوجد وراثة أو طرق افتراضية وما إلى ذلك.يمكن أن تحتوي السجلات الجديدة على مُنشئ ولكن استخدامه اختياري نوعًا ما.

المجالات والمعايير الرئيسية لاستخدام السجلات:

  • عند التعامل مع بنيات من Win32 API

  • عندما لا يكون للأنواع هوية (لأن التعيين يعني النسخ)

  • عندما لا تكون المثيلات كبيرة جدًا (يصبح نسخ السجلات الكبيرة مكلفًا)

  • عند بناء أنواع القيمة، والتي يجب أن يحاكي سلوكها الأنواع الرقمية.ومن الأمثلة على ذلك التاريخ والوقت والأرقام المركبة والمتجهات وما إلى ذلك.ومن ثم يعد التحميل الزائد على المشغل ميزة رائعة، لكن لا تجعل ذلك العامل الحاسم.

ومن ناحية الكفاءة، لا تبالغ في هذا:

  • للأنواع الأصغر التي تضعها في المصفوفات كثيرًا.

وأخيرًا، قواعد استخدام الفصل أو السجلات لم تتغير حقًا عن الإصدارات السابقة من دلفي.

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

http://hallvards.blogspot.com/ 2007/10 / أكثر متعة مع enumerators.html للحصول على مزيد من المعلومات.

ويمكنك استخدام عامل الحمولة الزائدة (مثل تحويلات ضمنية). هذا يمكنك القيام به على دلفي 2007+ أو 2006.NET على الأشياء أيضا، ولكن فقط على هذه السجلات على 2006 Win32 و.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top