الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

فقط ## لمن يعمل وهو يدرك مايفعل ##

بدأه magedpc في 25 مايو 2008 · 9 رد · 1,093 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سؤال واحد فقط واجابته معرفية وليست عملية

عندما نقوم بعمل توارث

بين كلاسين كلاهما بهما دوال هذه الدوال منها ماهو

Non-Static

ومنها ماهو

Static

عند اجراء استدعاء للدوال من الكلاس الابن الوارث صفات الكلاس الاب

لماذا لاتظهر الدوال التي هي من نوع

Static ?????

#2

ومن قال لك هذا ؟

يمكن ان نستدعى دوال او حقول ستاتيكية من الابن الذي ورثها من الاب . خذ المثال التالي :

using System;
class MyBase
{
 public static int x = 25;
 public static void Method()
 {
  Console.WriteLine("Base static method"); 
 }

}
class MyClass : MyBase
{
}
class MyClient
{
 public static void Main()
 {
  MyClass.Method(); // Displays 'Base static method'
  Console.WriteLine(MyClass.x);// Displays 25
 }
}

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#3

الدوال دائما تتبع للكلاس و لاتتبع للكائن

لذا اذا كان ليدك كلاس Person و فيه دالة static wakeUp()I مثلا ، ثم عملت كائن من ال person و سميته حp1

لن تسطيع نداء الدالة من الكائن p1.wakeUp()I

و لكن يمكنك نداء الدالة عن طريق الكلاس نفسه ، person.wakeUp()I

اما عن موضوع الورايثة هذا ، فليس لدي فكرة عنها

#4

الـstatic members هي ما يسمى بـtype level members. أي أنها على مستوى الكلاس و ليس على مستوى الـinstance كباقي أنواع الـmembers. هذا يعني أنه دائماً توجد نسخة واحدة فقط منه في الذاكرة مهما كان عدد نسخ الكلاس نفسه، حتى عندما يتم توريثها إلى كلاس إبن تبقى هناك static member واحدة. فعندما تستدعي static member من الكلاس الإبن فأنت في الواقع تستدعي الـstatic member الخاص بالكلاس الأب.

لهذا السبب لا يمكن عمل override على static member.

تم تعديل هذه المشاركة بواسطة System Down في 25 مايو 2008 في 11:56

#5
System Down كتب:
الـstatic members هي ما يسمى بـtype level members. أي أنها على مستوى الكلاس و ليس على مستوى الـinstance كباقي أنواع الـmembers. هذا يعني أنه دائماً توجد نسخة واحدة فقط منه في الذاكرة مهما كان عدد نسخ الكلاس نفسه، حتى عندما يتم توريثها إلى كلاس إبن تبقى هناك static member واحدة. فعندما تستدعي static member من الكلاس الإبن فأنت في الواقع تستدعي الـstatic member الخاص بالكلاس الأب.

لهذا السبب لا يمكن عمل override على static member.

الكلام سليم 100%

أحسنت أخي .

#6

أشكر لكم تفاعلكم مع هذا السؤال ولكن لفهم الفكرة أكثر وابراز خبرتك في مسألة التوارث قم بالنظر إلى الكود ولكن بعد قرأت الملاحظات التالية :

.

.

ماهو الأمر الذي سيكتب في الدالة

Main

لاستدعاء الكلاس الأب

Honda

لتنفيذ الدالة

Speed

الموجودة في الكلاس الابن

CIVIC

علما أن الدالة موجودة بنفس الاسم والنوع في الكلاسين

أي أن التوارث الكلاس الاب من الكلاس الابن بشرط ان تكون الدوال

static

اكيد بتقول نعمل

virtual - override

ولكن كيف

أليك الكود

class CarExhibition

{

static void Main()

{
                // هنا  قم بوضع اوامر الاستدعاء المطلوبة منك 
}

}

class Honda

{

int Spd = 220;

public static void Speed()

{

Console.WriteLine("Honda CIVIC Speed Is : {0} MPH", Spd); 

}



}

class CIVIC : Honda

{

int Spd = 160;

public static void Speed()

{

Console.WriteLine("Honda CIVIC Speed Is : {0} MPH", Spd);

}

}
#7

لم أفهم السؤال.

هل تريد أن يرث الكلاس الأب من الكلاس الإبن أم ماذا؟

#8
System Down كتب:
لم أفهم السؤال.

هل تريد أن يرث الكلاس الأب من الكلاس الإبن أم ماذا؟

نعم ياعزيزي الاب يرث من الابن داله اسمها ونوعها موجوده في الكلاسين

أقرأ السؤال جيداً لعلك تجد ظالتك

#9

لكن كيف يرث كلاس من كلاس هو أصلاً ورث منه؟ أم أنك تقصد أن هناك كلاس ثالث؟

#10
اقتباس
ماهو الأمر الذي سيكتب في الدالة

Main

لاستدعاء الكلاس الأب

Honda

لتنفيذ الدالة

Speed

الموجودة في الكلاس الابن

CIVIC

علما أن الدالة موجودة بنفس الاسم والنوع في الكلاسين

أي أن التوارث الكلاس الاب من الكلاس الابن بشرط ان تكون الدوال

static

اكيد بتقول نعمل

virtual - override

ولكن كيف

ولماذا تستخدم الأب لإستدعاء داله ستاتيك في الإبن ؟

الدوال الستاتيك لا يمكن تعريفها كـ override أو virtual

لماذا لا تستدعي دالة الإبن مباشرة سواءاً من داخل الأب أو من خارجه :

CIVIC.Speed();

على العموم الكود فيه خطأ , يجب أن يكون المتغير المحلي Spd ستاتيك أيضاً

أما إذا أردت تخطي الدالة الأب فيمكنك إضافة كلمة new في تعريف الدالة الإبن :

		   public new static void  Speed()
				   {
					   Console.WriteLine("Honda CIVIC Speed Is : {0} MPH", Spd);
				   }

..

مواضيع مشابهة