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

Proplems with OOP in VB.NET

مغلق
بدأه hazzoom في 8 سبتمبر 2005 · 11 رد · 996 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم :

وأنا أقرأ كتاب

"OOP with Microsoft Visual Basic .NET and Microsoft Visual C# Step "

واجهتني بعض النقاط التي لم أفهمها فمن يفهم هذه النقاط جيدا فلا يبخل علي بشرح ...,

1- ما هو الـ Overriding وما فائدته ؟

أنا أعلم أنه يتم عمل Overriding عن طريق كتابه كلمة Overridable في الاعلان عن الداله أو الخاصيه في كلاس ما ,,, وعند عمل وراثه من هذه الكلاس نجد أنه يمكن الحصول علي هذه الدوال أو الخواص بحيث تكون Overrides ولكن كل داله يمكن أن نجعلها تقوم بوظيفه مختلفه !!!

فما وظيفة الـ Override في هذه الحاله ؟؟؟

وهل لا يتم التعامل مع الـ Override الا في حالة الوراثه من كلاس أخري ؟؟؟

2- عند انشاء كلاس جديده وبناء (Constructor (Sub New وكان لا يأخذ Parameters وأنشأنا كلاس أخري وورثنا من الكلاس الأولي فسوف يحدث التالي (في الصوره).....

أما لو كان الـ Constructor في الكلاس الأولي لا يأخذ Parameters فلا تحدث مشاكل!!!

ما العلاقه بين الـ Constructor والوراثه؟؟؟

08_09_05_11_02_45_1126202565bc.JPG

08_09_05_11_05_12_1126202712dc.JPG

3- عند انشاء Abstract Class عن طريق اضافة العباره MustInherit في الاعلان عن الكلاس نجد أنه يمكن انشاء Constructor لهذه الكلاس علي الرغم من أنه لا يمكن انشاء New Object من هذ النوع من الـ Abstract Class , لماذا ؟؟؟

08_09_05_11_05_37_1126202737mi.JPG

08_09_05_11_06_02_1126202762nmi.JPG

هذه النقاط لم أفهمها جيدا رغم أني أعدت القراءة في الكتاب أكثر من مره....,,,

ساعدوني بأي معلومه , جزاكم الله خيرا,,,

#2

أهلا بك إلى البرمجة الشيئية!

خذ هذا المثال البسيط، وأعتقد أنه سيجاوب أسئلتك بإذن الله، لا تنس أن تقوم باللازم للترجمة!!

افترض أن لدي فئة تسمى Shape وهي شكل ما! افترض أيضا أنه ليكون عندك شكلا، يجب أن يكون عندك موقعا له!

لاحظ معي أنها abstract لأنه لا يوجد حقيقة شكل عام، لكنه عندنا مربع، دائرة مثلث، وهكذا.

لهذا جعلناه abstract, وخاصة أمر الرسم draw.

public abstract class Shape{
Point point;
//حتى يكون عندنا شكلا، يجب أن يكون عندنا موقعا!!
//  لهذا إذا أراد أحدهم أن يطور شكلا جديدا يجب عليه أن يعطينا موقعا!
//لاحظ أن هذا منشئ أو صانع أو Constrcutor
public Shape(Point p){
point = p;
}
public abstract void draw();

public Point getPosition(){
return point;
}

وهذا مربع:

public class Square extends Shape{
int length;
public Square(Point p, int l){
super(p); // الآن ننادي المنشئ الموجود في الفئة شكل!! يجب علينا ذلك حتى نصنع شكلا جديدا!
//لاحظ أنك إذا لم تنادي على هذه الدالة سيخرج خطأ كما في صورتك الثانية! 
length = l;
}
public void draw(){//overriden method.
System.out.println("Drawing Square"+ (length * 4));

}
}

وهذه دائرة:

public class Circle extends Shape{
int radius;
public Circle(Point p, int r){
super(p);
radius=r;
}
public void draw(){//Overiden method.
System.out.println("Drawing circle: "+(2 * radius * Math.PI));
}
}

لاحظ كيف استفدنا من إعادة تعريف الدالة draw!!

نستطيع الآن أن نصنع هذا البرنامج البسيط.

public class Test{
public static void main(String[]args){
Point p1=new Point(0,0);
Point p2=new Point(5,5);
Point p3=new Point(90,30);

Shape s1= new Square(p1,10);
Shape s2= new Circle(p2,30);
//كلهم أشكال
s1.draw();
s2.draw();
// اطبع المواقع:
System.out.println(s1.getPosition());
System.out.println(s2.getPosition());


Shape s3=new Shape(p3);// خطأ، لا يوجد شيء اسمه شكل فقط

}
}

بالمناسبة إذا صنعت فئة بلا منشئ كالتالي:

public class MyClass {}

فإن الحاسب سينشئ منشئا عند الترجمة ليصبح هكذا
public class MyClass{
MyClass(){}
}

أعتقد أنك عرفت الآن لماذا خرجت لك الأخطاء!

بالتوفيق!!

تم تعديل هذه المشاركة بواسطة أبومازن في 9 سبتمبر 2005 في 19:36

#3

بالنسبة للسؤال الاول :

فما وظيفة الـ Override في هذه الحاله ؟؟؟

وظيفتها تتمحور في شقين والله أعلم

الاول : عندما تريد أن تملك إجراء مطابق لما في قالب الاب وتريد أن لا يتم تنفيذ ما في الاب بل مافي الابن الوارث .

الثاني : هو إذا أردت أن تستفيد من الاجراء في قالب الاب دون العناء في إعادة كتابة العمليات فيه

فما عليك إلا إستخدام العنصر myBase.RoutineName فقط.

وهل لا يتم التعامل مع الـ Override الا في حالة الوراثه من كلاس أخري ؟؟؟

لا يمكن لانه التخطي يعتمد على الوراثة . و أن المُتخطي لابد أن يكون إبن ليتخطى السلوك أو الخاصية أوووو إلخ.

بالنسبة للسؤال الثاني

كونك وارث للقالب الاول فلابد أن تنادي بناء هذا القالب إذا كان البناء يحتوى على ممررات بهذا الشكل

Public Sub New(ByVal x As Integer)
MyBase.New(x)

End Sub

ولا يعفيك عن ذلك إلا في حالة أن البناء ليست له ممررات أو أن له أكثر من بناء.

بالنسبة للسؤال الثالث أعتقد أن ما طرحته لا يعارض المنطق إطلاقاً

و السبب أنه قد يكون هنالك قالب يورَث وله بناء constructor

فهذا القالب على البناء الذي به لا يمكن أن يكون كل و إنما جزء

و أضرب لك مثال على ذلك

قد يكون هنالك كلاس من نوع مركبة Vehicle كقالب (اب)

وهنالك قالب سيرث الـ Vehicle وهو قالب من نوع Car سيارة أو دراجة وهذه السيارة أو الدراجة ستُورث المحرك

وفي ممرر المحرك تحدد السرعة كبناء

مع أن قالب المحرك له ممرر إلا أنه لا يمكن أن يكون ذو فائدة لوحدة إلا مع السيارة (الإطارات قالب موروث أخر, ناقل الحركة

وهو كذلك قالب موروث , جسم المركبة وهلم جرى....

والله أعلم .

في المثال يتضح المقال

#4

جزاك الله خيرا يا أخ أبو مازن ولكن للأسف لم أفهم بسبب اختلاف الـ Syntax .. :( وبعض المصطلحات,,,

أخ غملاسي ,,,

يعني هل نقدر نقول يا غملاسي ان الـ Override هو نوع من (الاقتباس) من Classes أخري عند الوراثه منها ؟؟؟

اقتباس
لا يمكن لانه التخطي يعتمد على الوراثة . و أن المُتخطي لابد أن يكون إبن ليتخطى السلوك أو الخاصية أوووو إلخ

هل أفهم من ردك أنه لا يمكن التعامل مع الـ Override الا في حالة الوراثه فقط ؟؟؟

بالنسبه لردك في السؤال الثالث لم أفهمه يا ريت توضح بمثال (بالكود) وليس نظريا , لأني لم أفهم حتي الآن لماذا الـ Abstract Class يمكن بناء Constructor لها علي الرغم من أنه لا يمكن انشاء Object جديد منها!!!

لو ممكن كمان سؤال : لو لدي 2كلاس واحدbase وأخري drived فهل ممكن أن ترث الثانيه بعض الدوال والخواص وليس الكل حيث أن عبارة Inherits ترث كل الكلاس ؟؟؟

جزاكم الله خيرا ,,,

تم تعديل هذه المشاركة بواسطة hazzoom في 9 سبتمبر 2005 في 14:38

#5

هذه محاولة للترجمة:

public MustInherit Class Shape
Dim x as Integer
Dim y As Integer
'  حتى يكون عندنا شكلا، يجب أن يكون عندنا موقعا!!
'  لهذا إذا أراد أحدهم أن يطور شكلا جديدا يجب عليه أن يعطينا موقعا!
' لاحظ أن هذا منشئ أو صانع أو Constrcutor
public Sub New(x1 as Integer, y1 as Integer)
	x=x1
	y=y1
End Sub
'If you want to have a shape, you should know how to draw it
public MustInherit draw()

public Sub getX() as Integer
	return x
End Sub
public Sub getY() as Integer
	return y
End Sub

End Class

وهذا مربع:

public Class Square Inherits Shape
Dim length as Integer
public Sub New(x1 as Integer, y1 as Integer, l as Integer)
	MyBase.New(x1,y1) ' الآن ننادي المنشئ الموجود في الفئة شكل!! يجب علينا ذلك حتى نصنع شكلا جديدا!
'لاحظ أنك إذا لم تنادي على هذه الدالة سيخرج خطأ كما في صورتك الثانية! 
	length = l;
End Sub

public overide Sub draw()//overriden method.
	Console.Wrote("Drawing Square"+ (length * 4))

End Sub

End Class

وهذه دائرة:

public class Circle Inherits Shape
Dim radius as Integer
public Circle(x1 as Integer, y1 as Integer, r as Integer)
	MyBase.New(x1,y1);
	radius=r;
End Sub

public Overide Sub draw() '  Overiden method.
	Console.Write("Drawing circle: "+(2 * radius * Math.PI));
End Sub

End Class

لاحظ كيف استفدنا من إعادة تعريف الدالة draw!!

نستطيع الآن أن نصنع هذا البرنامج البسيط.

public class Test
public Sharred Sub Main()


	Dim s1 as New Square(0,0,10)
	Dim s2 as New Circle(15,10,30)
'كلهم أشكال
	s1.draw
	s2.draw
' اطبع المواقع:
	Console.Write(s1.getX)
	Console.Write(s2.getX)


	Dim s3 as New Shape(20,20)' خطأ، لا يوجد شيء اسمه شكل فقط

End Sub

End Class

تم تعديل هذه المشاركة بواسطة أبومازن في 9 سبتمبر 2005 في 19:53

#6

السلام عليكم

اقتباس
يعني هل نقدر نقول يا غملاسي ان الـ Override هو نوع من (الاقتباس) من Classes أخري عند الوراثه منها ؟؟؟

في الحقيقة لا, التخطي شيئ و الاقتباس شيء أخر , فالتخطي هو تجاوز عمليات الاب مع إمكانية الاستفادة منها.

اقتباس
هل أفهم من ردك أنه لا يمكن التعامل مع الـ Override الا في حالة الوراثه فقط ؟؟؟

هذا الذي أعرفه و يعرفه المنطق , غير ذلك ( سأعيد قراءة كتاب OOP ) والله أعلى و أعلم.

اقتباس
بالنسبه لردك في السؤال الثالث لم أفهمه يا ريت توضح بمثال (بالكود) وليس نظريا , لأني لم أفهم حتي الآن لماذا الـ Abstract Class يمكن بناء Constructor لها علي الرغم من أنه لا يمكن انشاء Object جديد منها!!!

تفضل ترجمة الكود من أخينا أبو مازن مع بعض التعديل عليها

Public MustInherit Class Shape
    Dim x As Integer
    Dim y As Integer
   
    Public Sub New(ByVal x1 As Integer, ByVal y1 As Integer, _
    Optional ByVal I As Integer = 0)
        x = x1
        y = y1
    End Sub
    'If you want to have a shape, you should know how to draw it
    Public MustOverride Sub draw()

    Public Function getX() As Integer
        Return x
    End Function
    Public Function getY() As Integer
        Return y
    End Function

End Class


Public Class Square
    Inherits Shape
    Dim length As Integer

    Public Sub New(ByVal x1 As Integer, ByVal y1 As Integer, ByVal l As Integer)
        MyBase.New(x1, y1)
        length = l
    End Sub


    Public Overrides Sub draw()

        MsgBox("Drawing Square " & (length * 4))

    End Sub

End Class



Public Class Circle
    Inherits Shape
    Dim radius As Integer
    Public Sub New(ByVal x1 As Integer, ByVal y1 As Integer, ByVal r As Integer)
        MyBase.New(x1, y1)
        radius = r
    End Sub
    Public Overrides Sub draw()
        MsgBox("Drawing circle: " & (2 * radius * Math.PI))
    End Sub

End Class


Public Class Test
    Public Shared Sub Main()
        Dim s1 As New Square(0, 0, 10)
        Dim s2 As New Circle(15, 10, 30)
        'كلهم أشكال
        s1.draw()
        s2.draw()
        ' اطبع المواقع:
        MsgBox(s1.getX)
        MsgBox(s2.getX)
    End Sub

End Class

اقتباس
لو لدي 2كلاس واحدbase وأخري drived فهل ممكن أن ترث الثانيه بعض الدوال والخواص وليس الكل حيث أن عبارة Inherits ترث كل الكلاس ؟؟؟

أليس هذا جور في الوراثة , ربما بشكل أو بآخر أنت تقترب من الواجهة أكثر من القالب .

حسب علمي المتواضع ( لا ) أكمل في القراءة ستصل إلى shadowing و overloading و Interfaces

فلا ربما تتضح لك الرؤية أكثر من الان, توكل على الله و هو المستعان.

السلام عليكم.

AbstractClassApp.zip

تم تعديل هذه المشاركة بواسطة الغملاسي في 9 سبتمبر 2005 في 23:32

في المثال يتضح المقال

#7

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

Public MustOverride Sub draw()

لا أفهم MustOverride لأني أعرف وجود Overridable في الـ Base class ومنها نحصل علي Override في الـ Drived class ؟؟؟

تم تعديل هذه المشاركة بواسطة hazzoom في 11 سبتمبر 2005 في 11:03

#8

كلمات هذه اللغة كثيرة ولا فائدة منها إلى قليلا!

وللإجابة على سؤالك فأعتقد أن:

عموما: MustOverride = Overide

لكن هذه للطرق العادية والأخرى للطرق abstract!!

#9

السلام عليكم

MustOverride تعني أن عند إستخدام القالب Shape لابد أن تستخدم هذا السلوك أو الاجراء فهو إلزامي وليس إختياري.

Overridable يمكن تركه وعدم إستخدامة بينما MustOverride لايمكن على الإطلاق.

والله أعلم.

في المثال يتضح المقال

#10
In other words, the base class declares the method, but the derived class must define (that is, write the code for) the method........................

كلام سليم اخواني جزاكم الله خيرا , الاقتباس السابق من كتاب :

Visual Basic .NET Primer Plus

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

تم تعديل هذه المشاركة بواسطة hazzoom في 11 سبتمبر 2005 في 14:02

#11

اخي ابو مازن

MustOverride ==> abstract on java

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#12

كلامك صحيح أخي مبتدئ جدا ,,

MustOverride تلزمك بعمل Override للـ Method في جميع الـ Derived Classes ,

أما Override فقط فلا تلزمك بذلك ,

ولكن لا أعرف شيئا بالنسبه للـ Java ,

وشكرا مره أخري للتنبيه ......,,,

تم تعديل هذه المشاركة بواسطة hazzoom في 11 سبتمبر 2005 في 16:13

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

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