PDA

View Full Version : مبتدی: مشکل با نحوه اجرای وراثت



sara alavi
جمعه 28 خرداد 1389, 11:33 صبح
سلام
2 خط اول خروجیه برنامه زیر برای چیه؟

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Inheritance
{
using System;
public class Parent
{
string parentString;
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}

public class Child : Parent
{
public Child()
: base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
public void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}

public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}

}



خروجی

From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

2 خط اول مربوط به اجرای کدام خطوط ار main است؟

amir-yeketaz
جمعه 28 خرداد 1389, 12:12 عصر
f11 که بزنید میتونید مرحله به مرحله ی کارو با f11 زدن ببینید ...
شما وقتی میگید

Child child = new Child();
با new کردن و گفتن child(); با این کار کامپایلر میره سراغ constructor (سازنده) کلاس child که اگه شما یه base ای براش قرار نداده باشید خود به خود میره سراغ سازنده ی پیش فرض کلاس پدر ...
چون الان براش base گذاشتین پس اول میره سراغ این سازنده :

public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
با مقدار ورودی که بهش دادین : From Derived

حالا که کارش تو کلاس پدر تموم شد میاد سراغ سازنده ی کلاش فرزند (Child) و این قسمتو اجرا میکنه :

{
Console.WriteLine("Child Constructor.");
}

امیدوارم فهمیده باشین چی میگم ولی اگه شما f11 بزنید (در واقع Trace کنید!) متوجه میشید چه اتفاقی میفته ...
موفق باشید

sara alavi
جمعه 28 خرداد 1389, 12:34 عصر
یعنی اگه من کد

public Child()
: base("From Derived")
{
Console.WriteLine("Child Constructor.");
}

را نداشتم خروجی

parent Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

میشد؟


یه سوال دیگه:

اگه کد زیر رو

public Child()
: base("From Derived")
{
Console.WriteLine("Child Constructor.");
}


به


public Child()
{
consol.write("Child Constructor");


تغییر می دادم

خروجی

Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

میشد؟

amir-yeketaz
جمعه 28 خرداد 1389, 14:27 عصر
در جواب سوال اول :
بله ... درسته ...
وقتی که اون تیکه حذف بشه اووقت اول میره سراغ متد بدون پارامتر کلاس Parent (پیش فرض) که الان شما تو کلاس Parent سازنده ی پیش فرض خودتون رو OverLoad کردین ... و بعد میاد سراغ سازنده ی کلاس Child

در جواب سوال دوم :
خیر!!! ...
چرا:
وقتی که شما اون تیکه ی base رو بردارین اون موقع خود کامپایلر میره سراغ سازنده ی بدون پارامتر کلاس Parent و بعدم برمیگرده سراغ سازنده ی کلاس Child ... پس Child Constructor. چاپ میشه در لاین دوم ...

توضیحات کلی :
فرض کنید سه کلاس به نام A و B و C داشته باشید که به این صورت از هم ارث بری داشته باشن

class A
{
public A()
{
Console.WriteLine("A");
}

}
class B : A
{
public B()
{
Console.WriteLine("B");
}
}
class C:B
{
public C()
{
Console.WriteLine("C");
}
}

خوب حالا اگه تو متد Main یه شی از کلاس C بسازیم :

C c = new C();
خوب حالا خروجی چی میشه :

A
B
C
اول اون سازنده از کلاس base فراخوانی میشه و به صورت پله ای میاد بالا تا برسه به سازنده ی کلاس اصلی ...
حالا اگه شما بگین Base: دارین به اون سازنده ی ای که میخواین از کلاس پدر فراخونی بشه اشاره میکنین و دوست دارین که اون سازنده اجرا بشه ...


دیگه هر چی داشتم رو کردم ... واقعا امیدوارم به دردتون خورده باشه ....
موفق باشید