كيفية تنفيذ تعدادات COM من النوع الآمن؟
سؤال
كيف يمكنني تنفيذ التعدادات الآمنة في دلفي في سيناريو COM؟في الأساس، أود استبدال مجموعة من الثوابت البدائية للتعداد بمجموعة من مراجع الكائنات النهائية الثابتة المغلفة في فئة؟.في جافا، يمكننا أن نفعل شيئا مثل:
public final class Enum
{
public static final Enum ENUMITEM1 = new Enum ();
public static final Enum ENUMITEM2 = new Enum ();
//...
private Enum () {}
}
وإجراء المقارنات باستخدام نوع التعداد المخصص:
if (anObject != Enum.ENUMITEM1) ...
أستخدم حاليًا الإصدار القديم من دلفي 5 وأرغب في الإعلان عن بعض معلمات التعدادات على الواجهات، وعدم السماح لكائنات العميل بتمرير أنواع الأعداد الصحيحة (أو الطويلة) بدلاً من نوع التعداد المطلوب.هل لديك طريقة أفضل لتنفيذ التعدادات بخلاف استخدام تعدادات دلفي الأصلية؟
المحلول
لقد زودتنا الآن ببعض الأدلة الإضافية حول طبيعة سؤالك، وبالتحديد ذكر COM، وأعتقد أنني أفهم ما تقصده.يمكن لـ COM تنظيم مجموعة فرعية فقط من الأنواع التي تعرفها دلفي بين خادم COM والعميل.يمكنك تعريف التعدادات في محرر TLB، ولكن هذه كلها من النوع TOleEnum وهو في الأساس نوع عدد صحيح (LongWord).يمكنك الحصول على متغير من النوع TOleEnum بأي قيمة عددية تريدها وتعيين قيم من أنواع التعداد المختلفة لبعضها البعض.لا اكتب حقًا آمنًا.
لا أستطيع التفكير في سبب لعدم قدرة COM في دلفي على استخدام النوع الآمن للتعدادات بدلاً من ذلك، لكنه لا يفعل ذلك.وأخشى أنه لا يمكن فعل الكثير حيال ذلك.ربما التغييرات في محرر TLB في إصدار دلفي 2009 القادم قد تغير ذلك.
للسجل:عندما لا يتم استخدام محرر TLB، تكون دلفي قادرة تمامًا على الحصول على واجهة مع الأساليب التي تحتوي على التعدادات الآمنة كمعلمات.
نصائح أخرى
تعدادات دلفي الأصلية آمنة للنوع بالفعل.كانت تعدادات Java ابتكارًا لتلك اللغة، لأنه قبل ذلك لم تكن تحتوي على تعدادات على الإطلاق.ومع ذلك، ربما تقصد ميزة مختلفة - قيم التعداد مسبوقة باسم نوعها.
يدعم إصدار دلفي 2009 القادم، والإصدار الأخير من منتج دلفي لـ .NET، توجيهًا جديدًا يسمى التعدادات النطاقية.تبدو هكذا:
{$APPTYPE CONSOLE}
{$SCOPEDENUMS ON}
type
TFoo = (One, Two, Three);
{$SCOPEDENUMS OFF}
var
x: TFoo;
begin
x := TFoo.One;
if not (x in [TFoo.Two, TFoo.Three]) then
Writeln('OK');
end.
ما هو الخطأ في التعدادات دلفي الأصلية؟هم نوع آمن.
type
TMyEnum = (Item1, Item2, Item3);
if MyEnum <> Item1 then...
منذ دلفي 2005 يمكن أن يكون لديك ثوابت في الفصل الدراسي، لكن دلفي 5 لا تستطيع ذلك.
type
TMyEnum = sealed class
public
const Item1 = 0;
const Item2 = 1;
const Item3 = 2;
end;
أعتقد أنني أعرف سبب اختيار بورلاند عدم استخدام التعدادات الآمنة للكتابة في محرر TLB.يمكن أن تكون التعدادات في COM قيمًا مختلفة بينما تستطيع دلفي فقط منذ دلفي 6 (على ما أعتقد) القيام بذلك.
type
TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80); // Only since Delphi 6