PDA

View Full Version : کلاسهای abstract



resident
سه شنبه 16 بهمن 1386, 11:27 صبح
سلام.
من یک کلاس abstract دارم که با 2 کلاس دیگه رابطه داره و من یک نمونه از اونها رو در کلاس abstract،new کردم.حالا من تو کلاس که از این کلاس abstract مشتق شده میخوام از نمونه های new شده استفاده کنم اما نمیشه، میگه باید یک نمونه بسازی. مگه همه attribute ها و متدها و روابط کلاس پایه به کلاسهای مشتق شده به ارث نمیرسن؟

متشکرم.

reza_rad
سه شنبه 16 بهمن 1386, 11:31 صبح
کدتون رو بگذارید...

اَرژنگ
سه شنبه 16 بهمن 1386, 14:29 عصر
سلام.
من یک کلاس abstract دارم که با 2 کلاس دیگه رابطه داره و من یک نمونه از اونها رو در کلاس abstract،new کردم.حالا من تو کلاس که از این کلاس abstract مشتق شده میخوام از نمونه های new شده استفاده کنم اما نمیشه، میگه باید یک نمونه بسازی. مگه همه attribute ها و متدها و روابط کلاس پایه به کلاسهای مشتق شده به ارث نمیرسن؟

متشکرم.
تعریف و مشکلتان گیج کننده است، اصلا معلوم نیست اروری که میگیرید زمان کمپایل است یا در زمان اجرا، پروژه کاملتان را بفرستید که هم ارور را ببینیم و هم تمام کلاسها دستمان باشد.

resident
سه شنبه 16 بهمن 1386, 15:34 عصر
این قسمتی از کلاس abstract:


publicpartialclassfrm_vasileye_emale_loab : parent
{
()shablon sh = newshablon;
}

public abstract class vasileye_emale_loab
{
pishnahade_tarh pt = new pishnahade_tarh();
check_invalid_input cii = new check_invalid_input();
private string _code_vasileye_emale_loab;


public string code_vasileye_emale_loab
{
get {return _code_vasileye_emale_loab ;}
set
{
if (cii.chkletter_digit(value))
_code_vasileye_emale_loab = value;
else
return;
}
}

}


classshablon:vasileye_emale_loab
{
privatestring _code_shablon;
privatestring _tarikhe_resid_sal;
personel p=newpersonel();

...
}


در فرم وسیله اعمال لعاب یک آبجکت از کلاس شابلون ایجاد کردم و چون آبجکت کلاس پیشنهاد طرح به شابلون ارث رسیده ،می خوام به یکی از فیلدهای کلاس پیشنهاد طرح دسترسی داشته باشم. آیا این کار شدنی است؟

اَرژنگ
سه شنبه 16 بهمن 1386, 15:42 عصر
این قسمتی از کلاس abstract:


...


در فرم وسیله اعمال لعاب یک آبجکت از کلاس شابلون ایجاد کردم و چون آبجکت کلاس پیشنهاد طرح به شابلون ارث رسیده ،می خوام به یکی از فیلدهای کلاس پیشنهاد طرح دسترسی داشته باشم. آیا این کار شدنی است؟
۱) اینکه در کجایه کد به چه اروری بر میخورید را نگفتید
۲) اگر کلاس B از کلاس A به ارث ببره به تمام فیلدهای غیره private ش دسترسی دارد، با این مقدار کد نمیشه بیشتر از این کمک کرد.

resident
سه شنبه 16 بهمن 1386, 17:22 عصر
اگر کلاس B از کلاس A به ارث ببره به تمام فیلدهای غیره private ش دسترسی دارد،
به آبجکت ها چی؟ مثلا کلاس شابلون که از کلاس وسیله اعمال لعاب مشتق شده به شیء pt دسترسی داره؟

reza_rad
سه شنبه 16 بهمن 1386, 17:45 عصر
مثلا کلاس شابلون که از کلاس وسیله اعمال لعاب مشتق شده به شیء pt دسترسی داره
طبق کد شما خیر دسترسی نداره.
شما برای شی pt هیچ access modifier ای نگذاشتید. و پیش فرض در C# بصورت private است. پس شی pt در subclass دیده نخواهد شد. مگه اینکه بصورت public تعریف بشه.

resident
چهارشنبه 17 بهمن 1386, 00:11 صبح
طبق کد شما خیر دسترسی نداره.
شما برای شی pt هیچ access modifier ای نگذاشتید. و پیش فرض در C# بصورت private است. پس شی pt در subclass دیده نخواهد شد. مگه اینکه بصورت public تعریف بشه.
pt رو در کلاس وسیله اعمال لعاب public تعریف کردم اماموقع کامپایل error زیر رو میده.

Error 2 Inconsistent accessibility: field type 'lab_material.mahsoolat.pishnahade_tarh' is less accessible than field 'lab_material.mahsoolat.vasileye_emale_loab.pt' G:\Project Implementation\lab-material\lab-material\mahsoolat\vasileye_emale_loab.cs 9 32 lab-material

دلیل رخ دادن این errorچیه ؟چه جوری رفعش کنم.
متشکرم.

reza_rad
چهارشنبه 17 بهمن 1386, 12:10 عصر
کد کلاس pishnahade_tarh رو اینجا بگذارید.

Masoud_TB
چهارشنبه 17 بهمن 1386, 12:38 عصر
دلیلش اینه که کلاس shablon به صورت internal تعریف شده ولی مابقی کلاس ها public هستند در نتیجه compile time error خواهی داشت. کافیه که توی تعریف کلاسات همشون یک جور دسترسی داشته باشد. یا public یا internal.

نکته: اگر در تعریف یک کلاس از بکار بردن کلمات public یا internal استفاده نشود تعریف آن به صورت internal خواهد بود.

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

resident
چهارشنبه 17 بهمن 1386, 12:50 عصر
کد کلاس pishnahade_tarh رو اینجا بگذارید.


class pishnahade_tarh
{
private string _code_pishnahade_tarh;
private string _name_tarhe_pishnahadi;
private string _noe_mahsool;
private string _tedade_chap;
private string _zamine;
private string _tarikh;
private string _vaziat;
check_invalid_input cii = new check_invalid_input();

public string code_pishnahade_tarh
{
get { return _code_pishnahade_tarh; }
set
{
if (cii.chkletter_digit(value))
_ code_pishnahade_tarh = value;
else
return;
}
}

public string name_tarhe_pishnahadi
{
get { return _name_tarhe_pishnahadi; }
set
{
if (cii.chkletter(value))
_name_tarhe_pishnahadi = value;
else
return;
}
}

public string tedade_chap
{
get { return _tedade_chap; }
set
{
if (cii.chkdigit(value) )
if (int.Parse(value) <= 5 && int.Parse(value)>0)
_tedade_chap = value;
}
}

public string tarikh
{
get{return _tarikh;}
set
{
if(cii.ChkDate(value))
_tarikh=value;
}
}

public string vaziat
{
get{return _vaziat;}
set{ _vaziat = value;
}
public string noe_mahsool
{
get { return _noe_mahsool; }
set { _noe_mahsool = value; }
}

public string zamine
{
get { return _zamine; }
set { _zamine = value; }
}
}

reza_rad
چهارشنبه 17 بهمن 1386, 13:01 عصر
مشکل اینجاست:

class pishnahade_tarh
بجاش این رو بنویسید:


public class pishnahade_tarh

چون کلاس شما access modifier نداره یعنی بطور پیش فرض بصورت private تعریف شده و باعث ایجاد اون مشکل میشه. کلا در C# شما هر جای متغیر ، کلاسی تعریف کنی و براش Access modifier نگذاری بصورت پیش فرض private در نظر گرفته میشه.

Masoud_TB
چهارشنبه 17 بهمن 1386, 13:31 عصر
مشکل اینجاست:
چون کلاس شما access modifier نداره یعنی بطور پیش فرض بصورت private تعریف شده و باعث ایجاد اون مشکل میشه. کلا در C# شما هر جای متغیر ، کلاسی تعریف کنی و براش Access modifier نگذاری بصورت پیش فرض private در نظر گرفته میشه.


دوست عزیز اصولا کلاس های یا بهتره بگیم تمامی تایپ هایی که در سطح namespace تعریف می شوند نمی توانند private باشند و در نتیجه حداقل دسترسیشون internal خواهد بود.

پس کلاس نمی تواند private باشد مگر اینکه به صورت nested تعریف شود.

reza_rad
چهارشنبه 17 بهمن 1386, 15:35 عصر
دوست عزیز اصولا کلاس های یا بهتره بگیم تمامی تایپ هایی که در سطح namespace تعریف می شوند نمی توانند private باشند و در نتیجه حداقل دسترسیشون internal خواهد بود.

پس کلاس نمی تواند private باشد مگر اینکه به صورت nested تعریف شود.
بله صحیح است. اشتباه از من بود. همانطوری که گفتند کلاس private تعریف نمیشه.