easyDelphi Q&A
+4 تصويتات
40 مشاهدات
type
  TMyClass<UDataType> = class
  private
    FValue: UDataType;
  public
    function ToString(const AValue:UDataType): string;
  end;

هل ممكن شرح هذا الكود بالاضافة الى ادراج عنوان مفتاحي لأتمكن من البحث عن هذا الموضوع اكثر ومعرفة المزيد؟

سُئل في تصنيف vcl بواسطة (1,770 نقاط)
عُدل بواسطة | 40 مشاهدات
 

2 إجابة

+1 تصويت

العنوان المفتاحي يمكنك إستخدام Generic Class في دلفي كلما وجدت <> يسمى Generic.  يمكن شرح المثال الموضوع في السؤال كاتالي: هذه عبارة عن Class من نوع UDataType قد يكون Integer, String, TDatetime, Record,...ّأو نوع أنشأته انت خاص بك  والذي سيستعمل كنوع خاص بالكلاص عند القيام بعملية إنشاء Object. العنصر PValue هو حقل عادي مصرح كالمعتاد غير انه عند تعريف الحقول يجب استعمال الاسم الكامل للكلاص مع النوع المستعمل  "UDataType "

type
  TMyClass<T> = class
  private
    FValue: T;
	FNbr :integer;
	procedure SetNbr(Value : Integer);
  public
 	property Value : T read FValue Write FValue;
	property Nbr: Ineteger Read FNbr Write SetNbr;
  end;
....

...

procedure TMyClass<T>.SetNbr(Value: Integer);
begin
 FNbr := Value;
end;
end;

طرقة الإنشاء والاإستعمال

var
 MyObject: TMyClass<Integer>;
begin
 MyObject:= TMyClass<Integer>.Create; //إنشاء كلاص ذات نوع عددي

 MyObject.Value := 10;
 MyObject.Nbr := 10;

 MyObject.Value := 'String'; //خطأ  لا يمكن تجاوز هذ السطر لأن الكومبايلر ينتظر قيمة عديدية
 MyObject.Nbr := 22;
End;

 

تم الرد عليه بواسطة (7,420 نقاط)
+1 تصويت

بشكل عام هذا يسمى Template وبشكل خاص بالدلفي او الباسكال يسمى Generic
هو طريقة لتوفير كتابة وتكرار الكود لاكثر من مرة
مثلا انت بحاجة لعمل كلاس يحتوي على حقل من نوع integer و تابع يبحث عن كلمة و يرجع النوع integer،
كتبنا الكود

program generic_test;
{$mode delphi}{$h+}

type
    TMyIntegerFind = Class(TObject)
    public
    	Value: Integer;
        function Find(Name: string): Integer;
    end;

function TMyIntegerFind.Find(Name: string): Integer;
begin
	//code to find value
    Result := 10; //for testing only
end;

begin
end.

فيما بعد اضطررت لكتابة كود يعمل نفس العمل لكن لنوع Double مااللذي سيحدث؟

تكرار الكود

 

program generic_test;
{$mode delphi}{$h+}

type
    TMyIntegerFind = Class(TObject)
    public
    	Value: Integer;
        function Find(Name: string): Integer;
    end;

function TMyIntegerFind.Find(Name: string): Integer;
begin
	//code to find value
    Result := 10; //for testing only
end;

//---------------------------------------------

type
    TMyDoubleFind = Class(TObject)
    public
    	Value: Double;
        function Find(Name: string): Double;
    end;

function TMyDoubleFind.Find(Name: string): Double;
begin
	//code to find value
    Result := 10; //for testing only
end;

begin
end.

بدون ال template او generics انت مضطر لتكرار الكود، او استعمال بعض الحيل، لكن باستعمال ال generic سيكون الوضع اسهل
 

program generic_test;
{$mode delphi}{$h+}

type
    TMyFind<TMyType> = Class(TObject)
    public
    	Value: TMyType;
        function Find(Name: string): TMyType;
    end;

//---------------------------------------------

    TMyIntegerFind=TMyFind<Integer>;
    TMyDoubleFind=TMyFind<Double>;


function TMyFind<TMyType>.Find(Name: string): TMyType;
begin
	//code to find value
    Result := 10; //for testing only
end;

begin
end.

 

تم الرد عليه بواسطة (10,460 نقاط)

اسئلة متعلقة

+4 تصويتات
2 إجابة
سُئل أغسطس 29 في تصنيف vcl بواسطة Ammar Salah (1,770 نقاط) | 51 مشاهدات
+2 تصويتات
1 إجابة
سُئل أكتوبر 27 في تصنيف vcl بواسطة youcef (240 نقاط) | 33 مشاهدات
+4 تصويتات
1 إجابة
سُئل أغسطس 29 في تصنيف vcl بواسطة Ammar Salah (1,770 نقاط) | 26 مشاهدات
0 تصويتات
1 إجابة
سُئل يوليو 16 في تصنيف vcl بواسطة djaoui (1,410 نقاط) | 72 مشاهدات
+4 تصويتات
3 إجابة
سُئل أغسطس 15 في تصنيف Delphi بواسطة djaoui (1,410 نقاط) | 40 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

268 سؤال
478 إجابة
838 تعليق
166 مستخدم