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

وراثة كلاس مع تغير نوع أحد خصائصه

مغلق
بدأه MSVS في 9 مايو 2007 · 26 رد · 2,574 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

هناك كلاس له بعض الخصائص من ضمنها :

		Private intOutputID As Integer

Public Overridable Property OutputID() As Integer
			Get
				Return intOutputID
			End Get

			Set(ByVal value As Integer)
				intOutputID = value
			End Set

		End Property

هذه الخاصية قابلة للتخطي كما تشاهدون Overridable

أنشأت كلاس آخر و ورثته الكلاس السابق الذي ذكرنا أحد خصائصه بالأعلى .

وعند الخاصية OutputID أردنا تخطيها فكتبنا الكود التالي :

		Private intOutputID As Integer

Public Overrides Property OutputID() As Integer
			Get
				Return intOutputID
			End Get

			Set(ByVal value As Integer)
				intOutputID = value
			End Set

		End Property

إلى هنا لا مشكلة :)

المشكلة تظهر عند تغيير نوع الخاصية من النوع Integer إلى مصفوفة من نوع Integer

كالتالي :

		Private intOutputID() As Integer

		Public Overrides Property OutputID() As Integer
			Get
				Return intOutputID
			End Get

			Set(ByVal value() As Integer)
				intOutputID = value
			End Set

		End Property

هل يمكن وراثة كلاس مع تخطي أحد خصائصه و تغيير نوعها ؟

والسلام عليكم

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#5

ولكن نحن نتحدث عن خاصية وليست حدث !

و نريد تغير نوعها وليس قيمتها .

يبدو أن ذلك ممنوع في الدوت نت ، و الله أعلم

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#7
hazzoom كتب:
لازم يكونوا بنفس الـ DataType والا اكتب Property جديده ,,,

إذا كان يشترط نفس الـ DataType !

فلا أظن أن الـ Overrides في الخصائص يحقق أفضل أداء ؟

راح أقترح على مايكروسوفت في الـ Service pack القادم يضيفوا هذه الميزة :lol:

شكراً لكم ،،

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#8

اصل لو غيرت الـ DataType هتبقي Property غير الأصليه نهائيا يعني هيتغير الـ Signature , أتمني لو أحد الأخوه مبرمجي الـ C بلس يقولنا لو كان فيه غير كده في الـ OOP في السي بلس , لأن ميكروسوفت دماغها عالية :D

#9

ال Overriding تعني ان خاصية ما يمكن ان تغير عملها من كلاس الى آخر

اما ما تتحدث عنه انت سيدخل في نطاق ال OverLoading بمعنى ان الخاصية يصبح لها نوعين مختلفين

#10

جزاك الله خيراً

تصدق كنت أظن الـ OverLoads خاصة بالإجراءات فقط :rolleyes:

ألف شكر ،،

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#11

امممممممممممم ،

اولاً لاتستطيع تغيير أحد خصائص الأب ، لأن ذلك ليس من صلاحياتك

الشئ الآخر لايوجد مايسمى OVERRIDING OR OVERLOADING FOR ATTRIBUTES

overload & override خاصه بالmethods ، فالثنتين هي أصل تعدد الأشكال أو مايسمى polymorphisem

حتى static method فإنها لاتعمل كـ overrding method بل hiding فقط

عندما تعرف attribute في subclass بغض النظر نفس النوع أم لا ، فهذا يعني أنه attribute آخر ، فقط نفس الاسم ، فالكومبايلر أثناء polymorphisem لن يهتم بها ، ويذهب دائماً إلى super class .

مثال :

class A{
	int i=1;

}
class B extends A{
   int i=0;
	public static void main(String... args){
		A a=new B();
		System.out.println(a.i);
	}
}

يطبع 1 ،

ان كنت لاتريد الخاصيه موجوده في الابن بامكانك جعلها في الاب بـprivate ،

فهنا الابن لايعرف عنها شيئاًَ ، ولكن في كل الأحوال لاتستطيع عمل overriding or overloading للattribute

#12

كما قال الأخ أيوب نستخدم Overloading

مثالك

Class Test
	Private intOutputID As Integer

	Public Property OutputID() As Integer
		Get
			Return intOutputID
		End Get

		Set(ByVal value As Integer)
			intOutputID = value
		End Set

	End Property
End Class

وفي الكلاس الذي سيرثه

Class test1
	Inherits Test

	Private intOutputID() As Integer

	Public Overloads Property OutputID() As Integer()
		Get
			Return intOutputID
		End Get

		Set(ByVal value() As Integer)
			intOutputID = value
		End Set

	End Property

End Class

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 10 مايو 2007 في 12:36

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#13
عيسى عايد العنزي كتب:
ولكن في كل الأحوال لاتستطيع عمل overriding or overloading للattribute

عفواً يا عيسى ، لقد كان هذا فهمي بالسابق .

ولكن بعد تطبيق كلام أخي /الإدريسي نجحت في تغيير خصائص الكائن بواسطة الـ Overloading ، انظر المثال الذي وضعه أخي / محمد سامر

شكراً لكم جميعاً ،،

تم تعديل هذه المشاركة بواسطة Ayoub JAMAL EL IDRISSI في 10 مايو 2007 في 18:21

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#15

كلامي انحذف يبدو انني اواجه مشكله في المنتدى ، كل شوي اسجل الدخول ،

المهم ان هذا ليس overloading هذا redefining

قد يكون عدم فهمي الجيد للـvb.net سبب في قولي هذا ، ولكن مهما كان إلى الآن ارى ان مثال الاخ سلوم هو redefining وليس overloading ،

وياأخي MVCV مهما كان فالـattribute cannot be overloading or overriding

اتمنى ان يقوم احد الاخوه بوضع مثال للتحقق من polymorphism في مثال اخونا محمد سلوم ،

بانتظاركم

#16

يمكن تخطي الخاصية في الـ Base Class عن طريق كتابة ما يلي في Drivided Class:

Public Shadows Property OutputID() as integer

...

...

...

End Property

#17

أخي عيسى

اولا دعنا نتفاهم على نقطة و هي ان ال Properties يمكن ان نقوم بعمل Overriding لها و اليك مثال من كتاب Visual Basic .NET Programming Language, The :

Class Order
  Public Cost As Double
  Public Quantity As Integer

  Public Overridable ReadOnly Property Total() As Double
	Get
	  Return Cost * Quantity
	End Get
  End Property
End Class

Class ForeignOrder
  Inherits Order

  Public ConversionRate As Double

  Public Overrides ReadOnly Property Total() As Double
	Get
	  Return MyBase.Total * ConversionRate
	End Get
  End Property
End Class

هذا مثال واضح و هو يوضح ال Overriding لخاصية Property و انت اثبث هذا بقولك :

اقتباس
المهم ان هذا ليس overloading هذا redefining

و على حسب فهمي البسيط لكلمة redefining في ال OOP فهي مساوية لل Overriding يعني تغيير كود لنفس الميتود المورثة من كلاس أب

اما المثال الذي طرحه الأخ سامر فهو لعمل OverLoading للخاصية

قد يكون هناك فرق بين الجافا و الدوت نت في هذه الامور ربما و نتمنى ان تاتني بمقالات حول هذا الأمر تؤكد ان ما تقول حتى نتمكن من زيادة علمنا في هذا المجال و شكرا لك :)

#18

أخ أيوب أيضا أنت تعلم أنه يمكن تنفيذ طلب الأخ السائل باستخدام Shadows كما ذكر الأخ FireBox

تعديل لمثالي المذكور

   Public Class test2
		Inherits Test

		Private intOutputID() As Integer

		Public Shadows Property OutputID() As Integer()
			Get
				Return intOutputID
			End Get

			Set(ByVal value() As Integer)
				intOutputID = value
			End Set

		End Property

	End Class

وشرحها من MSDN

Specifies that a declared programming element redeclares and hides an identically named element, or set of overloaded elements, in a base class.

تحدد أن عنصر البرمجة المصرح عنه يعيد تصريح أو يخفي عنصرا له اسما مطابقا أو ضيط عناصر تحيل زائد في الفئة الأساسية

بينما OverLoads أيضا إليكم شرحها من MSDN

Specifies that a property or procedure redeclares one or more existing properties or procedures with the same name

تحدد ان الخاصية أو الإجرائية تعيد تعريف واحدة أو أكثر من الخصائص أو الاجراءات التي تمتلك نفس الاسم بالضبط

وأيضا شرح Overrides

Specifies that a property or procedure overrides an identically named property or procedure inherited from a base class

يحدد ان الخاصية أو الاجراء يتجاوز خاصية أو إجراء يمتلك نفس الاسم بالضبط والذي تم وراثته من الفئة الأب

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 10 مايو 2007 في 18:51

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#19

أهلاً أخي أيوب جمال و محمد سامر ،

أولاً لقد عدت كتابة ردي السابق حوالي عشر مرات ، لأن كانت هناك مشكله في تسجيل الدخول ، ويذهب الكلام ، حتى لو انسخه ماينسخ

قلت redefining بمعنى انه اعاد تعريفها من جديد فهي مثد جديده كلياً ( في نظري ) ،

وهناك فرق بين redefining & overriding

ففي الـredefining لاتتم عملية polymorphism فانت تقوم بتغطية المثد الموجوده في السوبر بالمثد الموجوده في السب كلاس مثل static methods

حتى لو رأيتها نفس الsignature ونفس كل شئ ، لكن لاتتم عملية polymorphisem بالأصح super class reference cannot invoke subclass method

، بينما في overriding فانت تفتح الباب لتعددية الاشكال او polymorphism

بالنسبه للـproperty لاأعرفها ، بل ولم استصيغها لأنها not readable & confusing the programmer ،

ثم كلام الأخ سلوم ، أزال الغموض لدي ،

اقتباس
Overloading

Specifies that a property or procedure redeclares one or more existing properties or procedures with the same name

كنت اعتقد بأنها لابد ان يتم التغيير في الargument list وليس فقط نفس الاسم !

أخيراً لدي تساؤل واحد فقط ، لتتضح الرؤيه بالكامل :

Public Class Form1

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Dim t As test1
		t = New test1()
		MessageBox.Show(t.OutputID)

	End Sub
End Class
Class Test
	Private intOutputID As Integer

	Public Property OutputID() As Integer
		Get
			Return intOutputID
		End Get

		Set(ByVal value As Integer)
			intOutputID = value
		End Set

	End Property
End Class

Class test1
	Inherits Test

	Private intOutputID() As Integer

	Public Overloads Property OutputID() As Integer()
		Get
			Return intOutputID
		End Get

		Set(ByVal value() As Integer)
			intOutputID = value
		End Set

	End Property

End Class

لماذا يظهرلي خطأ ، إن كان هناك overloading ألا يرى بأن هناك two methods ، ؟

الف شكر للجميع

تم تعديل هذه المشاركة بواسطة عيسى عايد العنزي في 10 مايو 2007 في 21:50

#20

أخي عيسى

الخطأ بسبب ما لونه أخضر .

Class Test

Private intOutputID As Integer

Public Overridable Property OutputID() As Integer

وهو التصريح في الكائن الأصل بأنه يجوز أن تتخطى (خاصيته) .

كما أنه لا يمكن أن يكون للكائن الواحد خاصيتين (Two Properties) بنفس الاسم .

ولهذا السبب لا تظهر الخصائص بشكل تحميل زائد عندما نستخدم معها Overloading .

تنبه أن هناك فرق بين الـ Method و الـ Property

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#21

اممممممم شئ جميل انك تتخطى خصائص الأوبجكت ، هذه هي OO بعينها !

بالمناسبه تذكر بأنك لاتستطيع عمل overloaing or overriding for attribute

والحمدلله بأن صن لاتفكر بوضع property في JDK وإلا ضعنا !

بالأخير أتمنى اني كنت ضيف خفيف على الجميع ، واعتذر عن كل خطأ بدر مني ، وتحيه للجميع وبالأخص أيوب

#22

بسم الله.... الله المستعان... مشكلة الموضوع أنه يحتوي على عدة مواضيع والبعض لم يفهم الآخر... وأعتقد أني فهمت الجميع، وربما أكون مخطئا،، لهذا سأبدأ في الفلسفة قليلا!

أخي MSVS،، سؤالك أجاب عليه الإخوان،، وأن ما أردت لا علاقة له بإعادة التعريف Overriding. وأن ما أردت هو تغيير المتغيرات التي يحملها المسمى الخاصية OutputID ، والتي لن تتم حتى بطريقة Overloading (خاصة مثالك) كما شرح الإخوان، ولن تنجح إلا باستخدام Shadows أو مثيلاتها، وباستخدامك لها يضيع منك Polymorphism وغيرها من أمور OO.

وسبب إضافة هذه الخدمة من MS التي تكسر OO هي حماية الفئة الوارثة Derived من العبث بالفئة الموروثة Base مستقبلا كعمل Update or Fixes خاصة بالموروث Base والتي لا يريد المبرمج أن تتأثر فئته Derived منها.. والله أعلم.

وهي ليست OO لأنه لا يتحقق Polymorphism من خلالها كما ذكرت.

وإن أردت التلاعب بالمتغيرات أو Parameters .... وهذا يعتمد على برنامجك وفئتك وماذا تريد بالضبط... ربما أردت أن تعمل Overriding لنوع المتغيرات... وهو بشكل مبسط تستطيع عمله باستخدام Generics. طبعا أنا لا أعرف ما هو الأنسب لك، لأني لا أعرف برنامجك! وهذا موضوع آخر.

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

أما موضوع قابلية إعادة تعريف Attributes أو المكونات الذي يبدو أن البعض لم يفهم ما قاله الآخر بسبب كثرة المسميات الغير مشتركة بين البيئات المختلفة. وقبل الإجابة سأضع تعاريف التي يفهمها البعض بطرق مختلفة.

في كل من جافا Java و سي شارب أو VB.Net لديهم مبادئ OO وسأخص بالذكر هذه الأمور.

1- المكونات أو المتغيرات Attributes

وهي مكونات أو متغيرات الفئة التي تحفظ حالةُ الشيء المكون. مثلا في أمثلة إخاواننا:

VB.Net

Class Father
Private intOutputID As Integer
End Class

وجافا

class A{
	int i=1;

}

وكل من اللغتين لا يمكنك عمل Override للمتغيرات كما أشار أخي عيسى إلا أنه أخطأ وقال عنها Properties وهذا سبب سوء الفهم.

طبعا تستطيع إخفاء Attributes وما غيره أو إعادة تعريف المتغير في الوارث Derived الخ...، لكنها ليست OO أو ليس لمبادئ OO دخل بها..

2- الخصائص Properties

وهي الطرق التي من خلالها نستطيع التعامل مباشرة مع Attributes

وهذه الطرق يمكن عمل Override لها... وموجودة في الجافا كما هي موجودة في غيرها ولكن شكلها مختلف، الأمر الذي لم يدركه البعض.

VB.Net

Public Property OutputID() As Integer
		Get
			Return intOutputID
		End Get

		Set(ByVal value As Integer)
			intOutputID = value
		End Set

	End Property

جافا

public void setID(int id){...}

public int getID(){...}

مع ملاحظة أن الشكل في الكتابة مثل أي طريقة أو Method إلا أنهما يحملان نفس الاسم ولكن بـ set و get في بداياتهما. وقد ذكر أيوب وأبوسلو عن إمكانية عمل Override للخصائص أو Properties.

3- الطرق Methods

وهي الطرق المعروفة الأخرى القابلة Override وغيرها من الأمور.

أرجو ألا أكون قد ضيعت الموضوع.... أحببت التنويه إلى سوء الفهم الظاهر في كلام بعض الإخوة بين Attributes و Properties. مع إضافة التنويه على الأشياء الموجودة في اللغات الخاصة التي ليس لل OO دخل بها مباشرة.

في موضوع شيق آخر..

في أمان الله

حسام الملحم

#24

انا متأسف لما بدر مني ، أكرر أسفي ، فقط كنت استغرب من الطريقه

ارجوا المعذره

#25

لا معذرة ولا شيء.. أصلا لست أنت من أساء الفهم أولا... فأنت قلت Attribute في المشاركة رقم 11، وإنما أخي أيوب هو الذي بدأ وفهم أنك تقصد Property في المشاركة رقم 17،، وبعدها لا أدري أين ذهب الموضوع...

آسف يا إخوان على المداخلة الغريبة، لكن خلصت دراسة..

تم تعديل هذه المشاركة بواسطة حسام الملحم أبومازن في 11 مايو 2007 في 03:11

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…