الأساليب الثابتة والمتغيرات في Java. الأعضاء المشتركين في كائنات الفصل. الخصائص والأساليب الثابتة
طرق النوع الثابتهي أداة إطار لغة تم تنفيذها للعمل مع أعضاء البيانات الثابتة. ويمكن تقسيم هذه الأساليب إلى نوعين:
الأساليب الثابتة في الفئات الثابتة؛
الأساليب الثابتة في الفئات غير الثابتة.
إذا أعلن مبرمج عن فئة ثابتة، فإن جميع أعضاء هذه الفئة تصبح ثابتة، بما في ذلك الأساليب. هذه هي طرق الفئات - حاويات التعليمات التي تقبل كائنات من أنواع أخرى للمعالجة وتنتج قيمة النوع التي يحتاجها المبرمج.
الحالة الأكثر شيوعًا هي عندما يحتاج المبرمج إلى تنفيذ مجموعة من التعليمات المستقلة عن كائن الكتابة. مجموعة التعليمات هذه هي طريقة ثابتة، حيث يتم استدعاؤها قبل إنشاء مثيل من النوع.
إعلان واستدعاء طريقة ثابتة
يتم تعريف الطريقة بأنها ثابتة باستخدام الكلمة الأساسية الثابتة قبل نوع الإرجاع في تعريف الطريقة في نطاق الفئة:
فئة عامة Somenonstaticclass ( // أعلن عن الحقول الثابتة. static int firststaticfield; static string Secondstaticfield; // أعلن عن الحقول غير الساكنة. double firstnonstaticfield; float Secondnonstaticfield; // أعلن عن طريقة ثابتة. static void FirstStaticMethod() ( // تنفيذ أ طريقة ثابتة. WriteLine(firststaticfield);
يمكن للمبرمج استدعاء طريقة ثابتة عبر اسم النوع الذي تم تعريفه فيه:
فئة UseStaticMethods ( static void Main() ( // استدعاء طريقة ثابتة عبر اسم النوع. Somenonstaticclass.FirstStaticMethod(); ) )
قيود على الاستخدام
الأساليب الثابتة لا تشارك في الميراث. أنها مختومة. لا يمكن إلا أن تكون مثقلة، ولكن لا يمكن إعادة تعريفها. يتم التعبير عن القيد في حقيقة أن الأساليب الثابتة تنتمي إلى الفئة التي تم تعريفها فيها، والأساليب غير الثابتة تنتمي إلى كائن الفئة.
فئة عامة Somenonstaticclass ( // قم بتعريف الحقول الثابتة للفئة static int firststaticfield; static string Secondstaticfield; double firstnonstaticfield; float Secondnonstaticfield; // أعلن عن طريقة ثابتة. static void FirstStaticMethod() ( // تنفيذ الطريقة الثابتة. وحدة التحكم .WriteLine(firststaticfield); Console.WriteLine( Secondstaticfield); // قم بتحميل طريقة FirstStaticMethod().
الأساليب الثابتة للفئة غير الثابتة في كتلة التنفيذ لها حق الوصول فقط إلى الأعضاء الثابتين. لا يمكنك استخدام أعضاء غير ثابتين في الأساليب الثابتة:
فئة عامة Somenonstaticclass ( // قم بتعريف الحقول الثابتة للفئة static int firststaticfield; static string Secondstaticfield; double firstnonstaticfield; float Secondnonstaticfield; // أعلن عن طريقة ثابتة. static void FirstStaticMethod() ( // تنفيذ الطريقة الثابتة. وحدة التحكم .WriteLine(firststaticfield); Console.WriteLine( Secondstaticfield); Console.WriteLine(firstnonstaticfield); // سيتسبب السطر في حدوث خطأ في الترجمة لأنه يتم استخدام عضو غير ثابت داخل عضو ثابت.
ثم يمكننا الوصول إليها مباشرة من خلال اسم الفئة ومشغل دقة النطاق. ولكن ماذا لو كانت متغيرات الأعضاء الثابتة خاصة؟ خذ بعين الاعتبار الكود التالي:
في هذه الحالة، لا يمكننا الوصول مباشرةً إلى Anything::s_value من main() نظرًا لأن هذا العضو خاص. عادةً، يتم الوصول إلى الأعضاء الخاصين في الفصل من خلال الطرق العامة. بينما يمكننا إنشاء طريقة عادية للوصول إلى s_value، سيتعين علينا بعد ذلك إنشاء كائن من تلك الفئة لاستخدام هذه الطريقة! هناك خيار أفضل - يمكننا أن نجعل الطريقة ثابتة.
مثل متغيرات الأعضاء الثابتة، لا ترتبط الأساليب الثابتة بأي كائن فئة واحدة. هذا هو المثال أعلاه، ولكن بطريقة ثابتة:
فئة أي شيء (خاص: static int s_value؛ public: static int getValue() (return s_value;) // طريقة ثابتة)؛ int أي شيء::s_value = 3; // تعريف متغير العضو الثابت للفئة int main() ( std::cout<< Anything::getValue() << "\n"; }
نظرًا لأن الطرق الثابتة غير مرتبطة بكائن معين، فيمكن استدعاؤها مباشرة من خلال اسم الفئة وعامل تحليل النطاق، ويمكن أيضًا استدعاؤها من خلال كائنات الفئة (ولكن هذا غير مستحسن).
لا تحتوي الطرق الثابتة على هذا المؤشر *
الأساليب الثابتة لها ميزتان مثيرتان للاهتمام. أولاً، نظرًا لأن الأساليب الثابتة غير مرتبطة بكائن ما، فهي لا تحتوي على ! وهذا أمر منطقي، لأن هذا المؤشر يشير دائمًا إلى الكائن الذي تعمل عليه الطريقة. قد لا تعمل الأساليب الثابتة من خلال كائن، لذلك ليس هناك حاجة لهذا المؤشر.
ثانيًا، يمكن للطرق الثابتة الوصول مباشرةً إلى الأعضاء الثابتين الآخرين (المتغيرات أو الوظائف)، لكن لا يمكنها الوصول إلى الأعضاء غير الثابتين. وذلك لأن الأعضاء غير الثابتين ينتمون إلى كائن الفئة، لكن الأساليب الثابتة لا تنتمي إليه!
مثال آخر
يمكن تعريف الأساليب الثابتة خارج نص الفصل. هذا يعمل بنفس الطريقة كما هو الحال مع الطرق العادية. على سبيل المثال:
فئة IDGenerator (خاص: static int s_nextID؛ // إعلان متغير عضو ثابت public: static int getNextID(); // إعلان طريقة ثابتة)؛ // تعريف متغير العضو الثابت يقع خارج نص الفصل. يرجى ملاحظة أننا لا نستخدم الكلمة الأساسية الثابتة هنا // ابدأ في إنشاء المعرفات عند 1 int IDGenerator::s_nextID = 1; // تعريف الطريقة الثابتة يقع خارج نص الفصل. يرجى ملاحظة أننا لا نستخدم الكلمة الأساسية الثابتة هنا int IDGenerator::getNextID() ( return s_nextID++; ) int main() ( for (int count=0; count< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }
مولد معرف الفئة خاص : ثابت int s_nextID ؛ // إعلان متغير عضو ثابت عام: ثابت int getNextID(); // إعلان طريقة ثابتة // ابدأ في إنشاء المعرف من 1 int IDGenerator::s_nextID = 1; int IDGenerator::getNextID() (إرجاع s_nextID++;) انت مين() لـ (عدد العمليات = 0؛ عدد< 4 ; ++ count ) الأمراض المنقولة جنسيا::كوت<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ; العودة 0 ; |
نتيجة:
المعرف التالي هو: 1
المعرف التالي هو: 2
المعرف التالي هو: 3
المعرف التالي هو: 4
يرجى ملاحظة أنه نظرًا لأن جميع المتغيرات والوظائف في هذه الفئة ثابتة، فلا نحتاج إلى إنشاء كائن من هذه الفئة للعمل معه! يتم استخدام متغير عضو ثابت لتخزين قيمة المعرف التالي الذي سيتم تعيينه له، ويتم استخدام طريقة ثابتة لإرجاع المعرف وزيادته.
تحذير بشأن الفئات التي تحتوي على جميع الأعضاء الثابتين
كن حذرًا عند كتابة الفصول الدراسية مع جميع الأعضاء الثابتين. في حين أن مثل هذه "الفئات الثابتة البحتة" يمكن أن تكون مفيدة، إلا أن لها عيوبها أيضًا.
أولاً، بما أن جميع الأعضاء الثابتين يتم إنشاؤهم مرة واحدة فقط، فلا يمكن أن تكون هناك نسخ متعددة من "فئة ثابتة بحتة" (دون استنساخ الفئة ثم إعادة تسميتها). على سبيل المثال، إذا كنا بحاجة إلى كائنين IDGenerator مستقلين، فلن يكون هذا ممكنًا من خلال فئة "ثابتة تمامًا".
ثانيًا، نعلم من الدرس o أن المتغيرات العامة خطيرة لأن أي جزء من التعليمات البرمجية يمكن أن يغير قيمه وسينتهي به الأمر بتغيير أجزاء أخرى من التعليمات البرمجية التي تبدو غير ذات صلة (مزيد من التفاصيل). وينطبق الشيء نفسه على الفئات "الثابتة تمامًا". نظرًا لأن جميع الأعضاء ينتمون إلى الفصل (وليس كائناته)، والفئات لها نطاق عالمي، فإننا في "فئة ثابتة بحتة" نعلن عن الوظائف والمتغيرات العالمية بكل السلبيات الموجودة فيها.
C++ لا يدعم المنشئات الثابتة
إذا كان بإمكانك تهيئة متغير عضو عادي عبر، فمن المنطقي أن تكون قادرًا على تهيئة متغيرات الأعضاء الثابتة عبر مُنشئ ثابت. وعلى الرغم من أن بعض اللغات الحديثة تدعم المنشئات الثابتة لهذا الغرض بالذات، إلا أن C++، لسوء الحظ، ليست واحدة منها.
إذا كان من الممكن تهيئة المتغير الثابت الخاص بك مباشرةً، فلن تكون هناك حاجة إلى مُنشئ: يمكنك تحديد متغير عضو ثابت حتى لو كان خاصًا. نقوم بذلك في المثال أعلاه باستخدام s_nextID. وهنا مثال آخر:
فئة شيء (عام: ثابت std::vector
فئة شيء عام: ثابت الأمراض المنقولة جنسيا::vector< char >s_mychars ; الأمراض المنقولة جنسيا::ناقل< char >شيء :: s_mychars = ( "o" , "a" , "u" , "i" , "e" ) ; // تحديد متغير عضو ثابت |
إذا كانت تهيئة متغير العضو الثابت الخاص بك تتطلب تنفيذ تعليمات برمجية (مثل حلقة)، فهناك عدة طرق مختلفة للقيام بذلك. الطريقة التالية هي الأفضل. على الرغم من أن هذا قد يكون معقدًا بعض الشيء (في الوقت الحالي) وربما لن تحتاج إليه أبدًا، إلا أنه يمكنك تخطي بقية هذا البرنامج التعليمي بأمان إذا كنت ترغب في ذلك.
#يشمل