PDA

View Full Version : خطای non-static variable this cannot be ...



L u k e
جمعه 10 دی 1389, 15:10 عصر
این خطا چی می گه ؟

مثلا این جا



class A {


class B
{

}

class C
{
public static B Method()
{
B item = new B();

return item;
}
}
}


توی متد B نمی زاره این کارو انجام بدم B item = new B(); وقتی متد رو Static می کنم Eror می ده

javaphantom
جمعه 10 دی 1389, 16:20 عصر
شما وقتی یک متدود استایتک در یک کلاس تعریف می کنید با این کار این متدود رو از کلاس مستقل می کنید. یعنی اگر متغییر داینامیک داشته باشید نمی تونید توی متدود استاتیک تعریف کنید چون او متغییر داینامیک متعلق به کلاس هست ولی متدود استاتیک شما متعلق به کلاس نیست. class B داستان همون متغییر داینامیک رو داره. از طرفی کلا شما چند کلاس رو تو هم درست کردید به این عمل می گن Inner class. نکته شما نمی توانید در inner class که الان کلاس B ,C شماهست کلا استاتیک فیلد یا متدودی تعریف کنید.

L u k e
شنبه 11 دی 1389, 14:47 عصر
!!!!
من توی C# اینطوری کار می کردم و هیچ مشکلی هم نداشتم
یعنی توی یک متد static نمی شه یک متغیر dynamic داشت ؟ مثلا من الان می خوام توی کلاس B که یک کلاس static هست یک متغیر Static از نوع کلاس C تعریف کنم بازم نمی زاره
خوب الان باید چی کنم ؟ می شه با یه نمونه بم بگین

javaphantom
شنبه 11 دی 1389, 19:56 عصر
!!!!
من توی C# اینطوری کار می کردم و هیچ مشکلی هم نداشتم
یعنی توی یک متد static نمی شه یک متغیر dynamic داشت ؟ مثلا من الان می خوام توی کلاس B که یک کلاس static هست یک متغیر Static از نوع کلاس C تعریف کنم بازم نمی زاره
خوب الان باید چی کنم ؟ می شه با یه نمونه بم بگین

ببین مهندس static و dynamic هر کدوم معنای خودشون رو دارن. اینکه شما تو #C چی کار می کردی و الان نمی تونی خب شما برو با همون #C کد بزن. خرج من و که نمی دی زبان جاوا هم که ارث بابای من نیست که اینطوری داری با من حرف می زنی.
static یعنی جدا از کلاس چرا ما تابع public static void main(String[] r); d داریم و خیلی راحت صداش می کنیم و کلاسمون رو توش instance می گیریم در حالی که خود این متدود داخل همون کلاس هست ولی بدلیلی که قبل اشاره کردم هر متدود استاتیک یعنی جدا از یک کلاس. برای همین وقتی شما می خواهید یک متدود استاتیک رو صدا بزنید نیازی نیست کلاسی که داخلش هست instance بگیری. این قائده کاملا در زبان #C هم وجود داره.

هر کلاس از طریق field هاش تعریف می شه نه متدود یا رفتاراش. اگر ما می گیم متدود استایتک مستقل از کلاس هست پس کاملا درست و منطقی هست که فیلدهای غیر استاتیک هم نتونی توش استفاده کنی. چون فیلد ها هستند که کلاس تعریف می شه. توی #C هم همین قانون هست.

اما اینکه شما می یایی این کلاس رو می اندازی توی اون کلاس بعد می یایی اون یکی رو static می کنی یکی رو private می کنی بعد نمی دونم از پدر جد کلاس مادرس ارث می گیری کاملا نشون می ده که شما اصلا developer ماهری نیستی بهتر بگم developer نیستی بلکه programmer یا همون دانشجو برنامه نویس هستی. شما قبل از اینکه شروع به کد زدن بکنی اول از همه زبان و مفاهیم و قدرت پیادی سازی مفاهیم رو در زبان نمی دونی. با بحث clean code به هیچ عنوان آشنا نیستی. و از همه مهمتر اینه که علت اینطور کد زدن هم از شما بپرسن دلیلی برای اون نداری.

بحث inner class و anonymous class ها و همچنین static class و static method ها در جاوا کاملا با رعایت قوانین درست object oriented پیاده سازی شده. یعنی کسی واقعا مفاهیم object oriented رو دونسته باشه نه اینکه با dot زدن توی IDE برنامه بنویسه اون vb هم انجام می ده، متوجه می شه که جاوا یک زبان کاملا قانون مند هست که تمام مفاهیم Object Oriented رو درست پیاده سازی کرده.

حرف شما مثل این می مونه که من برم توی فروم #C داد بزنم این چه زبونه ای هست من با C++ کد می زدم از ۱۰ کلاسم هم ارث می بردم.

اون یک زبان هست با مفاهیم و قوانین خودش این هم یک زبان دیگست. مثل زبون آدمیزاد. خوبه به ما ها زبان چینی یا ژاپنی تو مدارس یا دانشگاه درس نمی دن.

شما اون چیزی که توی #C پیاده سازی کرده بودی و کار می کرد رو اینجا بزار تا من براتون به جاوا تبدیل کنم
از حرفهای منم ناراحت نشو. منظور بدی نداشتم.

L u k e
شنبه 11 دی 1389, 20:39 عصر
منظورم این نبود فکر نمی کردم تفاوت ها از این جا شروع شه
در ضمن مشکل من با فهم متدهای static نیست
---------------------------------------------------------
خوب من باید یه اتوموسیون ساده واسه یه شرکتی بنویسم قبلا پروژه با Asp.net استارت خورده بود و گفتم با Jsp انجامش بدم هم بیشتر با Jsp آشنا می شم هم بهتره هم ....
--------------------------------------------------------------
من از این Design Pattern واسه 3layer استفاده می کنم و ازش تقریبا راضی بودم
هر Entity یک کلاس داره و هر کلاس 3 کلاس داره اینجوری مثلا




public class C_User
{

public int ID;
public String FullName;
public String UserName;
public String Password;
public int State ;


}
public class D_User
{

public C_User To_Obj(ResultSet res)
{
C_User item=new C_User();

try
{

item.ID=res.getInt("User_Id");
item.FullName = res.getString("User_Fname");
item.UserName = res.getString("User_Uname");
item.Password = res.getString("User_Pass");
item.State = res.getInt("User_State");

}
catch(Exception e)
{
item = null;
}

return item;
}

}
}
public class I_User
{


//public static C_User SelectById(int Id)
{

return ToObj(SqlEngine.ExecuteQuery("Select * from Tbl_User"));
}

}




کلاس C_EntityName که struct همون Entity اس کلاس D_EntityName هم که وظیفه تبدیلات رو به عهده داره به کلاس و List ای از نوع کلاس
کلاس I_EntityName هم که یه رابط ه واسه انجام عملیات رو Entity مون در بانک مثلا SelectById یا Insert(C_Entity Item) یا ِDelete و ...


به نظرم ساختار زیاد جالبی نباشه و باید تغییراتی کنه
خیلی ممنون ....

L u k e
شنبه 11 دی 1389, 21:32 عصر
بهتره این تاپیکو دیگه ادامه ندیم یه تاپیک جدید بسازید و توش درباره ی Design Pattern ها صبت کنیم .

javaphantom
شنبه 11 دی 1389, 22:48 عصر
هر جور دوست داری. در مورد کدوم pattern دوست داری صحبت کنی صحبت کن. بقیه هم حتما بهت کمک خواهند کرد.