تعریف کلاس و متد + استفاده از آن

kern

Member
سلام.
میخوام برنامه هایی که از این بعد مینویسم شی گرا باشن. اما خیلی در مورد شی گرایی اطلاعات ندارم و تازه شروع کردم. لطفا راهنمایی کنید.
مثلا در یه جایی از برنامه همچین فرمی دارم:

attachment.php

میخوام وقتی RadioBotton استاتیک رو انتخاب و P1 & P2 رو وارد کردم با کلیک بر روی Go جستجو به شکل زیر انجام بشه:


کد:
FLinqDataContext db = new FLinqDataContext();
            var Query = db.InventoryTables.Where(c => c.Name.Equals(txt_P1.Text));
            if (Query.Count() != 0)
            {
                InventoryViewer.DataSource = Query;
            }
            else
            {
                MessageBox.Show("No Match Record In DataBase", "Result");
            }

و در صورتی که RadioBotton داینامیک انتخاب شد جستجو در رویداد KeyPress مربوط به textBox انجام بشه (مثلا تکست باکس P1) به شکل زیر:

کد:
FLinqDataContext db = new FLinqDataContext();
                var Query = db.InventoryTables.Where(c => c.Name.Contains(txt_P1.Text) & c.Brand.Contains(txt_P2.Text));
                if (Query.Count() != 0)
                {
                    InventoryViewer.DataSource = Query;
                }












با مفهوم شی گرایی & لطفا با نمونه کد توضیح بدین. ممنون.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام.
میخوام برنامه هایی که از این بعد مینویسم شی گرا باشن. اما خیلی در مورد شی گرایی اطلاعات ندارم و تازه شروع کردم. لطفا راهنمایی کنید.
با مفهوم شی گرایی & لطفا با نمونه کد توضیح بدین. ممنون.

شاید متوجه نباشید اما در همین کد هم شما دارید از شی گرایی استفاده می کنید. FLinqDataContext و RadioBotton و ... همگی شیء هستند.
کلا زمانی که در NET. برنامه نویسی می کنید از شیء و شیء گرایی استفاده می کنید. دلیلش اینه که NET Framework. بر پایه و اصول شی گرایی طراحی شده
و هر چیزی که از Framework ئه NET. استفاده می کنه شی گرایی بکار می بره.

اما برای اینکه بهتر از شیء گرایی استفاده کنید لازمه که اصولش رو درک کنید و بکار ببرید. توصیه می کنم در مورد اصول و مبانی شی گرایی
کتاب بخوانید یا در اینترنت اصول و مبانی شی گرایی رو جستجو کنید. مطلب در این مورد خیلی زیاده.
 

kern

Member
شاید متوجه نباشید اما در همین کد هم شما دارید از شی گرایی استفاده می کنید. FLinqDataContext و RadioBotton و ... همگی شیء هستند.
کلا زمانی که در NET. برنامه نویسی می کنید از شیء و شیء گرایی استفاده می کنید. دلیلش اینه که NET Framework. بر پایه و اصول شی گرایی طراحی شده
و هر چیزی که از Framework ئه NET. استفاده می کنه شی گرایی بکار می بره.

درسته! اما منظورم این بود که:
1. چه جوری یه کلاس تعریف کنم و بعد اون دو تا متدی که بالا گفتم رو صدا بزنم؟!
2. مثلا همین تکست باکس های بالا هر دوتاشون دو رویداد متفاوت دارن که در شرایط خاص رخ میده. اینا رو چه جوری به شکل کلاس بنویسم و صدا بزنم؟!
 

the_king

مدیرکل انجمن
درسته! اما منظورم این بود که:
1. چه جوری یه کلاس تعریف کنم و بعد اون دو تا متدی که بالا گفتم رو صدا بزنم؟!
2. مثلا همین تکست باکس های بالا هر دوتاشون دو رویداد متفاوت دارن که در شرایط خاص رخ میده. اینا رو چه جوری به شکل کلاس بنویسم و صدا بزنم؟!

در منوی Project ویژوال استدیو گزینه ...Add Class رو انتخاب کنید. اسم فایلش رو بنویسید و OK کنید.
یک ساختار کلاس داخلش ایجاد میشه که می تونه اسمش Class1 یا هر اسم دیگری که می خواهید باشه :
کد:
    class [B][COLOR="#0000FF"]Class1[/COLOR][/B]
    {

    }

قبل از اینکه کلاس تعریف بشه ابتدا یکسری using هست :
کد:
using System;
using System.Collections.Generic;
using System.Text;
هر Namespace ای که بعدا قراره در کلاس بکار بره رو تدریجا اونجا اضافه می کنید، فرضا اگه با فرم و پنجره سر و کار دارید اضافه اش کنید :
کد:
using System;
using System.Collections.Generic;
using System.Text;
using [B][COLOR="#0000FF"]System.Windows.Forms[/COLOR][/B];

کد داخل کلاس رو درونش می نویسید. فرضا تعریف یک رویداد به نام Change که بعدا در زمان مناسب فراخوانی اش می کنید، در واقع مشخص می کنید که
چه زمانی و با چه شرایطی اتفاق بیافته :
کد:
    class [B][COLOR="#0000FF"]Class1[/COLOR][/B]
    {
        public event EventHandler [B][COLOR="#0000FF"]Change[/COLOR][/B];

    }

معمولا رویدادی مثل Change یک متدی مثل OnChange هم داره که هر جا لازم شد رویداد Change رو فراخوانی کنید :
کد:
        protected virtual void [B][COLOR="#0000FF"]OnChange[/COLOR][/B]()
        {
            EventHandler eh = [B][COLOR="#0000FF"]Change[/COLOR][/B];
            if (eh != null)
            {
                eh.Invoke(this, EventArgs.Empty);
            }
        }
معمولا متدی مثل OnChange رو بصورت protected virtual تعریف می کنند، نه private و نه public . دلیلش اینه که
شاید یک زمانی از این کلاس ارث بری کردید، اون زمان احتمال داره بخواهید تغییری بدهید و نیاز به override کردن OnChange باشه.

لابد این کلاس حداقل یک مشخصه داره، فرضا یک مشخصه Target که نشون میده شی این کلاس با کدوم فرم کار می کنه :
کد:
        private Form [B][COLOR="#0000FF"]_target[/COLOR][/B];

        public Form [B][COLOR="#0000FF"]Target[/COLOR][/B]
        {
            get
            {
                return [B][COLOR="#0000FF"]_target[/COLOR][/B];
            }
            set
            {
                [COLOR="#0000FF"][B]_target[/B][/COLOR] = value;
                [B][COLOR="#0000FF"]OnChange[/COLOR][/B]();
            }
        }
متغیر target_ مقدار داخلی مشخصه Target رو نگهداری می کنه، از بیرون کلاس دیده نمیشه چون private تعریف شده.
مشخصه Target از بیرون کلاس هم قابل دسترسی و تغییره، چون public تعریف شده. اگر مقدارش رو تغییر بدهید،
رویداد Change اتفاق می افته، چون در set اش OnChange رو فراخوانی می کنه.
من مشخصه رو از نوع Form تعریف کردم، اما اگه قراره با نوع فرم خاصی کار کنه، Form رو به اون نوع فرم خاص، فرضا Form1 تغییر دهید.

اصولا یک متد می سازید فرضا با نام Execute که کاری که قراره با فرم Target انجام بشه رو یکجا داخلش قرار بدهید،
چیزهایی که داخلش نوشتم صرفا مثال ئه :
کد:
        public void [B][COLOR="#0000FF"]Execute[/COLOR][/B]()
        {
            if ([B][COLOR="#0000FF"]_target[/COLOR][/B] == null)
            {
                return;
            }
            [B][COLOR="#0000FF"]_target[/COLOR][/B].Text = "Title";
            [COLOR="#0000FF"][B]_target[/B][/COLOR].WindowState = FormWindowState.Maximized;
        }

اصولا کلاس یک یا چند سازنده داره، فرضا سازنده ای که همون موقع ساختن مقدار Target رو هم مشخص کنه :
کد:
        public [B][COLOR="#0000FF"]Class1[/COLOR][/B]()
        {
            [B][COLOR="#0000FF"]_target[/COLOR][/B] = null;
        }

        public [B][COLOR="#0000FF"]Class1[/COLOR][/B](Form [B][COLOR="#0000FF"]Target[/COLOR][/B])
        {
            [B][COLOR="#0000FF"]_target[/COLOR][/B] = [B][COLOR="#0000FF"]Target[/COLOR][/B];
        }
شناسایی و تفکیک سازنده از متد های داخل کلاس ساده است، اولا اسمش اسم کلاس ئه و ثانیا چیزی مثل void یا نوع داده بازگشتی نداره.

کل کد کلاس که نام namespace اش در هر پروژه ای فرق می کنه :
کد:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace [B][COLOR="#0000FF"]WindowsFormsApplication1[/COLOR][/B]
{
    public class Class1
    {
        public event EventHandler Change;

        private Form _target;

        public Class1()
        {
            _target = null;
        }

        public Class1(Form Target)
        {
            _target = Target;
        }

        protected virtual void OnChange()
        {
            EventHandler eh = Change;
            if (eh != null)
            {
                eh.Invoke(this, EventArgs.Empty);
            }
        }

        public Form Target
        {
            get
            {
                return _target;
            }
            set
            {
                _target = value;
                OnChange();
            }
        }

        public void Execute()
        {
            if (_target == null)
            {
                return;
            }
            _target.Text = "Title";
            _target.WindowState = FormWindowState.Maximized;
        }
    }
}

مثالی از طرز استفاده کردن از این کلاس :
کد:
        private void Test()
        {
            Class1 c = new Class1(this);
            c.Change += new EventHandler(c_Change);
            c.Execute();
        }

        void c_Change(object sender, EventArgs e)
        {
            this.Text = "Value Changed!";
        }
 

جدیدترین ارسال ها

بالا