تحدث عن الفئات والكائنات في دلفي
1. لا يستطيع فهم عدة مفاهيم دون أن يكون متعلماً.
عند الحديث عن الفئات والكائنات، لا يسعنا إلا أن نذكر المفاهيم التالية: الفئات، والأشياء، والحالات. أنا شخصيا أعتقد أنه بخير
افهم الأمر بهذه الطريقة: يشير الكائن إلى مصطلح عام، وأي كيان في الطبيعة يمكن اعتباره كائنًا بينما يشير الفصل إليه
سلسلة من الفئات المقسمة إلى خصائص معينة لهذه الكائنات؛ يشير مثيل على وجه التحديد إلى كائن ينتمي إلى فئة معينة.
حسنًا، لا أحتاج أن أقول المزيد عن هذه المبادئ الكبيرة. لماذا لا نتبع نهجًا "معاكسًا"، فلنستخدم دلفي
رمز لشرح بعض المفاهيم التي طرحها هؤلاء الأجانب والتي يصعب علينا نحن الصينيين فهمها:
فار
أبتن:تبوتون؛
قم بتعريف ABtn ككائن ينتمي إلى فئة TButton، ولكن لا يمكن القول بأن ABtn هو مثيل لأنه لم
تم إنشاؤه، لذلك نقول أنه تم تعريف الكائن إذا تم تعريف مثيل، أكثر أو أقل
بعضها ليس دقيقا بما فيه الكفاية. :)
يبدأ
ABtn:=TButton.Create(Self);//إنشاء مثيل لـ TButton
ABtn.Caption:='object';
ABtn.Free;
نهاية؛
2. الكائن هو مؤشر الخروج والخروج
من وجهة نظر مادية، الكائن عبارة عن مساحة عنوان، ورمز مساحة العنوان هذا هو ما نحدده.
فئة "متغير". لذا يمكننا أن نفكر في الكائن كمؤشر للفئة. كما نعلم جميعا، للوصول إلى المؤشر، فقط
يجب تهيئة المؤشر. نظرًا لأن الكائن عبارة عن مؤشر، فيجب تهيئته. كيفية تهيئته؟
دعونا نتحدث عن تهيئة المؤشرات. هناك طريقتان لتهيئة المؤشر:
(1) التوزيع المباشر
فار
باينت: ^ عدد صحيح؛
يبدأ
جديد (باينت)؛
باينت ^:=12;
التخلص (باينت)؛
نهاية؛
(2) المتغيرات التي تشير إلى المساحات المخصصة الأخرى
فار
باينت: ^ عدد صحيح؛
أنا: عدد صحيح؛
يبدأ
أنا:=12;
باينت:=@i;
نهاية؛
ومن المثير للاهتمام أن هناك طريقتين لتهيئة "المؤشرات" مثل الكائنات:
(1) التوزيع المباشر
فار
أفورم: تيفورم؛
يبدأ
AForm:=TForm.Create(Self);
AForm.ShowModal;
AForm.Free;
نهاية؛
(2) أشر إلى حالات أخرى من المساحة المخصصة
فار
أفورم: تيفورم؛
يبدأ
AForm:=Self;
AForm.Caption:='هل تعلم؟ لماذا يحدث هذا؟
نهاية؛
يشير file://هذا AForm ومثيل النموذج إلى مشاركة نفس وحدة العنوان، وسوف تستجيب جميع العمليات على AForm
file:// إلى مثيل النموذج المقابل له.
بالحديث عن ذلك، يمكننا بسهولة شرح سبب تمرير معلمات كائن الإجراء (الوظيفة) بتنسيق مثل هذا:
(1)PRocedure SetEdit(var Edit:TEdit);
يبدأ
تحرير.النص:='11';
نهاية؛
و
(2) الإجراء SetEdit(Edit:TEdit);
يبدأ
تحرير.النص:='11';
نهاية؛
التأثير هو نفسه. (1) هو تمرير كيان TEdit كمرجع للمعلمة، (2) هو
قم بتمرير "مؤشر" كائن TEdit كمعلمة.
3. يمكن فهم الفصل على أنه نوع بيانات خاص
نحن نعلم أنه يمكن إجبار أنواع البيانات على كتابة التحويل، حيث يمكن فهم الفصل على أنه نوع بيانات
ثم يجب أن يكون أيضًا قادرًا على إجراء تحويل نوع الفصل. على سبيل المثال، الكود التالي هو حدث نقرة على زر (Button1):
(واحد)
الإجراء TForm1.Button1Click(Sender: TObject);
فار
Acaption:سلسلة؛
يبدأ
ACaption:=TButton(Sender).Caption;// يقوم المرسل بالتحويل من TObject إلى TButton
ShowMessage(Format('لقد قمت بالنقر فوق ''%s'' !',[ACaption]));
نهاية؛
في هذا الكود، المرسل هو كائن من نوع TObject، وقمنا بتحويله إلى نوع TButton. مثلك
إذا لم تتمكن من الرؤية بوضوح، يمكنك الرجوع إلى تحويل نوع البيانات المعتاد لدينا:
(اثنين)
الإجراء TForm1.Button1Click(Sender: TObject);
فار
S_Str:سلسلة؛
P_Str:PChar;
يبدأ
S_Str:='أنا أحب الصين!';
P_Str:=PChar(S_Str);
S_Str:='';
S_Str:=String(P_Str);
ShowMessage(S_Str);
نهاية؛
ومع ذلك، في عملية البرمجة كائنية التوجه، يتم التركيز على السلامة. على سبيل المثال، يواجه تحويل النوع القسري في (1) العديد من المشكلات.
حماية. التعليمة البرمجية التالية لا تزال تكتب الحدث Button1.OnClick:
(ثلاثة)
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
TCanvas(Sender).Brush.Color:=clRed;
نهاية؛
إذا قمت بتنفيذ ذلك، سيحدث خطأ. ألا ينتهك هذا الغرض من البرمجة الشيئية؟ لا، بالطبع
إذا كانت فئة، فيجب أن تكون هناك طريقة إكراه فئة خاصة. طريقة التغيير (3) هي كما يلي:
(أربعة)
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
(المرسل كـ TCanvas).Brush.Color:=clRed;
end;// استخدم للتحويل، حيث يمكن اكتشاف الخطأ ولن يؤثر على التشغيل العادي للبرنامج.
بالحديث عن ذلك، اسمحوا لي أن أذكر لغة VB بالمناسبة، إذا كنت قد تعلمت لغة VB، فقد تجد مصفوفة التحكم فيها أكثر متعة، خاصة في
عند كتابة برنامج مثل الآلة الحاسبة. لكن ماذا تقدم لنا دلفي؟ الجواب هو أنه يمكن أيضًا فتح دلفي بسرعة وإيجاز.
إصدار مثل هذا البرنامج. إذا قمت بذلك: ضع تحريرًا وعشرة أزرار في النموذج، ثم قم بتقسيم Button.Caption إلى
لا تقم بتعيينه على '0'، '1'، '2'،...'9'، ثم اكتب حدث OnClick للزر كما يلي:
(خمسة)
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
Edit1.Text:=Edit1.Text+(Sender as TButton).Caption;
نهاية؛
قم بربط أحداث OnClick الخاصة بالأزرار الأخرى بـ Button1Click وقم بتشغيل البرنامج. التصفيق يديك هذه الآلة الحاسبة
النموذج الأولي للبرنامج متوفر الآن. نحن نستخدم تحويل نوع فئة دلفي لتطوير وظيفة صفيف التحكم المشابهة لتلك الموجودة في VB.
البرنامج رائع أيضاً :)
4. الطبقة المجردة ومثيلاتها
هناك فئة في دلفي تسمى فئة مجردة، ولا يمكنك بسهولة إنشاء مثيل لها مباشرة. مثل: TStrings
عطوف. الكود التالي:
(واحد)
فار
StrLst:TStrings;
يبدأ
StrLst:=TSTrings.Create;
StrLst.Add('أنا أحب اليابان!');
StrLst.Free;
نهاية؛
هذا ليس صحيحا. إذًا كيف يمكنك إنشاء مثيلات للفئات المجردة مثل TStrings؟ الجواب هو استخدام عدم الضخ
فئة فرعية من الفيل. نحن نعلم أن TStrings لديها فئة فرعية غير مجردة من TStringList. يمكننا أن نفعل هذا:
(اثنين)
فار
StrLst:TStrings;
يبدأ
StrLst:=TSTringList.Create;// فئة فرعية StrLst بمساعدة مُنشئ الفئة الفرعية الخاصة بها
StrLst.Add('أنا أحب الصين!');
StrLst.Free;
نهاية؛
(ثلاثة)
فار
StrLst:TStringList;
يبدأ
StrLst:=TSTringList.Create;
file://Give up، لا تستخدم الفئات المجردة بعد الآن، فقط استخدم "ابنها" للقيام بأعمالك
StrLst.Add('أنا أحب الصين!');
StrLst.Free;
نهاية؛
5. تعتبر الفئات آلية تغليف عالية للبيانات والعمليات.
(1) تغليف البيانات
الوحدة الوحدة 2؛
واجهة
يكتب
TEmployee=class
خاص
اسم F: سلسلة؛
عام
إنشاء المنشئ؛
وظيفة GetName:سلسلة؛
الإجراء SetName(AName:String);
نهاية؛
تطبيق
{ موظف }
منشئ TEmployee.Create;
يبدأ
FName:='BlazingFire';
نهاية؛
الدالة TEmployee.GetName: سلسلة؛
يبدأ
النتيجة:=FName;
نهاية؛
الإجراء TEmployee.SetName(AName: String);
يبدأ
FName:=AName;
نهاية؛
نهاية.
كما هو موضح في الكود أعلاه، نستخدم إجراء SetName ووظيفة GetName لتعيين المتغير الخاص FName بالكامل.
التغليف. هذا هو كل ما يتعين علينا القيام به مع FName:
الاستخدامات
الوحدة 2؛
الإجراء TForm1.Button1Click(Sender: TObject);
فار
موظف: موظف؛
يبدأ
AEmployee:=TEmployee.Create;
AEmployee.SetName('Rose');// استخدم SetName لتعيين FName
messageBox(Handle,PChar(AEmployee.GetName),'Empoyee',0);
file://استخدم GetName للوصول إلى FName
AEmployee.Free;
نهاية؛
(2) تغليف العملية
الوحدة الوحدة 2؛
واجهة
يكتب
TDivision=Class
عام
file://تعدد الأشكال يجعل برنامجك أكثر "مرونة"
وظيفة GetDiv(Num1,Num2:Double):Double;overload;
الدالة GetDiv(Num1,Num2:integer):integer;overload;
نهاية؛
تطبيق
{ قسم }
الدالة TDivision.GetDiv(Num1, Num2: Double): مزدوج؛
يبدأ
يحاول
النتيجة:=Num1/Num2;
يستثني
النتيجة:=0;// يوفر آلية معالجة نقطية للتعامل مع الموقف الذي يكون فيه المقسوم عليه 0
نهاية؛
نهاية؛
وظيفة TDivision.GetDiv(Num1, Num2: عدد صحيح): عدد صحيح؛
يبدأ
يحاول
النتيجة:=Num1 div Num2;
يستثني
النتيجة:=0;// يوفر آلية معالجة نقطية للتعامل مع الموقف الذي يكون فيه المقسوم عليه 0
نهاية؛
نهاية؛
نهاية.
في الكود أعلاه، نستخدم آلية تعدد الأشكال للفئة لمعالجة التقسيم إلى تقسيم صحيح وتقسيم غير صحيح على التوالي، واستخدام شاشة معالجة الاستثناءات
ولإزالة الحالة التي يكون فيها الرقم 0، ولضمان سلامة العملية، عند الاتصال يمكننا القيام بذلك على النحو التالي:
الاستخدامات
الوحدة 2؛
{$R *.dfm}
الإجراء TForm1.Button1Click(Sender: TObject);
فار
القسم: TDivision؛
القيمة الرابعة: عدد صحيح؛
القيمة F: مزدوج؛
يبدأ
Division:=TDivision.Create;
IValue:=Division.GetDiv(1,2);
FValue:=Division.GetDiv(1.0,2);
IValue:=Division.GetDiv(1,0);
FValue:=Division.GetDiv(1.0,0);
Division.Free;
نهاية؛
6. الفصول الدراسية هي آلية لإعادة استخدام التعليمات البرمجية
على سبيل المثال، في 5، إذا أردنا إضافة وظيفة GetAdd إلى هذه الفئة لإجراء عمليات الإضافة، فيمكننا استخدام وراثة الفئة. يحب
فقط أكتب:
(واحد)
الوحدة الوحدة 2؛
واجهة
يكتب
TDivision=Class
عام
وظيفة GetDiv(Num1,Num2:Double):Double;overload;
الدالة GetDiv(Num1,Num2:integer):integer;overload;
نهاية؛
يكتب
TOperation=الفئة(TDivision)
عام
وظيفة GetAdd(Num1,Num2:Double):Double;
نهاية؛
تطبيق
{ قسم }
الدالة TDivision.GetDiv(Num1, Num2: Double): مزدوج؛
يبدأ
يحاول
النتيجة:=Num1/Num2;
يستثني
النتيجة:=0;
نهاية؛
نهاية؛
وظيفة TDivision.GetDiv(Num1, Num2: عدد صحيح): عدد صحيح؛
يبدأ
يحاول
النتيجة:=Num1 div Num2;
يستثني
النتيجة:=0;
نهاية؛
نهاية؛
{TOPperation}
الدالة TOperation.GetAdd(Num1, Num2: Double): Double;
يبدأ
النتيجة:=Num1+Num2;
نهاية؛
نهاية.
نحن هنا نرث فئة فرعية TOPeration من TDivision. يمكن أن تحتوي العملية على TDivsion
الطريقة العامة GetDiv لها أسلوبها الفريد GetAdd. هذا هو الفصل الذي يقدمه لنا "تناول كعكتك وتناولها أيضًا".
طريقة "الحصول على" ليست سيئة.