امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
کلاس
نویسنده پیام
pswin آفلاین
كاربر دو ستاره
**

ارسال‌ها: 151
موضوع‌ها: 11
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 0
( 19 تشکر در 11 ارسال )
ارسال: #1
کلاس
سلام دوستان
یه مشکل برای من تو کار با کلاسها پیش آمده، من میخوام مجموعه‌ای از کلاسها رو به یه اسم داشته باشم. . که بتونم کلاسی رو به این مجموعه اضافه و یا کم کنم. همینطور این مجموعه باید public باشه. به عنوان مثال یه آرایه دینامیک از کلاسها می‌خوام

۲۱-بهمن-۱۳۸۵, ۲۰:۴۹:۴۲
وب سایت ارسال‌ها
پاسخ
Programmer آفلاین
كاربر دو ستاره
**

ارسال‌ها: 79
موضوع‌ها: 4
تاریخ عضویت: تير ۱۳۸۵

تشکرها : 2
( 23 تشکر در 9 ارسال )
ارسال: #2
RE: کلاس
منظور شما کلاسهای Partial است(در واقع یک کلاس چند بخشی) یا اینکه می خواهید از Namespace (فضای نام مشترک) برای کلاسهاتون استفاده کنید؟
۲۲-بهمن-۱۳۸۵, ۰۷:۰۳:۰۹
وب سایت ارسال‌ها
پاسخ
pswin آفلاین
كاربر دو ستاره
**

ارسال‌ها: 151
موضوع‌ها: 11
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 0
( 19 تشکر در 11 ارسال )
ارسال: #3
RE: کلاس
نه هیچ کدوم، انگار نمی تونم منظورم رو برسونم.
مثلا با تعریف آرایه زیر
dim m(2) as class1 میتونم دو نمونه از یک کلاس رو داشته باشم. اما این برای من کافی نیست. من می‌خوام هر عضو آرایه من یک kry هم داشته باشه. یه چیزی تو مایه‌های Collection . یعنی همون کالکشنی که من بتونم به متدهای کلاس هم دسترسی داشته باشم مثلا:
m("class1").mtd1

ولی کالکشنها این قابلیت رو به من نمی‌دن که به متدهای کلاس دستسی داشته باشم.

۲۲-بهمن-۱۳۸۵, ۱۱:۴۹:۱۸
وب سایت ارسال‌ها
پاسخ
Programmer آفلاین
كاربر دو ستاره
**

ارسال‌ها: 79
موضوع‌ها: 4
تاریخ عضویت: تير ۱۳۸۵

تشکرها : 2
( 23 تشکر در 9 ارسال )
ارسال: #4
RE: کلاس
سلام مجدد!

2 روش وجود دارد برای اینکه متدهای کلاسهای مختلف را از آرایه ای از اشیای از نوع مختلف فراخوانید

1- روش اول اینکه شما می توانید یک آرایه از Object بسازید و اشیای خود را در آن بریزید و در هنگام استفاده از متدهای آنها آن اشیا را به نوع مورد

نظر غالب ریزی کنید. اما این روش را توصیه نمی کنم، چون بازیابی کردن نوع کلاس در زمان اجرا به این شکل دردسر دارد.

2-روش حرفه ای تر این است که تمامی کلاسهای مورد استفادهء خود را که به عنوان اشیای آن آرایه به کار می برید فرزند یک کلاس پایهء واحد قرار دهید و

تمامی متدهایی که در آرایه ممکن است احضار کنید را در این کلاس پایه به صورت مجازی محض تعریف کنید یا اینکه برای آنها یک تعریف کلی بنویسید. بدین صورت

هنگامی که آرایه را می سازید نوع آرایه را از نوع کلاس پایه قرار دهید سپس به راحتی می توانید به هر عضو آرایه یکی از اشیای کلاسهای فرزند آن کلاس

را منتسب کنید و نیز تمامی متدهایی که در کلاس پایه تعریف کرده اید مستقیماً بر روی تمامی اعضای آرایه قابله احضار خواهند بود.
در واقع این کاربرد توابع مجازی در زبان است که Virtual Methods یکی از 3 اصل اساسی کاربرد OOP است در کنار اِرث بری و محصور سازی.

Object Orinted Programming = Inheritance, Encapsulation, Virtual Methods

یک مثال ساده با #C
کد:
using System;
using System.Text;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;

namespace W
{
    public interface Shape
    {
        double GetArea();
    }

    public abstract class Shape2D : Shape
    {
        protected float m_fltX;
        protected float m_fltY;

        public Shape2D(float fltX, float fltY)
        {
            m_fltX = fltX;
            m_fltY = fltY;
        }

        double Shape.GetArea()
        {
            return Area;
        }

        public virtual PointF Position
        {
            get
            {
                return new PointF(m_fltX, m_fltY);
            }
            set
            {
                m_fltX = value.X;
                m_fltY = value.Y;
            }
        }

        public virtual double Area
        {
            get
            {
                return 0;
            }
        }
    }

    public class Point2D : Shape2D
    {
        public Point2D(float fltX, float fltY)
            : base(fltX, fltY)
        {
        }
    }

    public abstract class ShapeSimple : Shape2D
    {
        protected float m_fltWidth;

        public ShapeSimple(float fltX, float fltY, float fltWidth)
            : base(fltX, fltY)
        {
            m_fltWidth = fltWidth;
        }
    }

    public class Square2D : ShapeSimple
    {
        public Square2D(float fltX, float fltY, float fltWidth)
            : base(fltX, fltY, fltWidth)
        {
        }

        public override double Area
        {
            get
            {
                return Math.Pow(m_fltWidth, 2);
            }
        }
    }

    public class Rectangel2D : ShapeSimple
    {
        protected float m_fltHeight;

        public Rectangel2D(float fltX, float fltY, float fltWidth, float fltHeight)
            : base(fltX, fltY, fltWidth)
        {
            m_fltHeight = fltHeight;
        }

        public override double Area
        {
            get
            {
                return m_fltHeight * m_fltWidth;
            }
        }
    }

    public abstract class Shape3D : Shape2D
    {
        protected float m_fltZ;

        public Shape3D(float fltX, float fltY, float fltZ)
            : base(fltX, fltY)
        {
            m_fltZ = fltZ;
        }
    }

    public class Point3D : Shape3D
    {
        public Point3D(float fltX, float fltY, float fltZ)
            : base(fltX, fltY, fltZ)
        {
        }
    }

    public class NCube : Shape3D
    {
        protected uint m_intDimension;
        protected float[] m_fltAxisPos;
        protected Square2D m_sqrCubeFace;

        public NCube(float fltX, float fltY, float fltZ, float fltWidth, uint intDimension)
            : base(fltX, fltY, fltZ)
        {
            m_intDimension = intDimension;
            uint l_intDimensions = ((intDimension >= 3)? intDimension: 3) + 1;

            m_fltAxisPos = new float[l_intDimensions];
            m_sqrCubeFace = new Square2D(fltX, fltY, fltWidth);

            for (int l_intIndexer = 4; l_intIndexer < l_intDimensions; l_intIndexer++)
                m_fltAxisPos[l_intIndexer] = 0.0f;

            m_fltAxisPos[0] = 0;
            m_fltAxisPos[1] = fltX;
            m_fltAxisPos[2] = fltY;
            m_fltAxisPos[3] = fltZ;
        }

        public override double Area
        {
            get
            {
                if (m_intDimension < 2)
                    return 0;
                else if (m_intDimension == 2)
                    return m_sqrCubeFace.Area;
                else
                    return 2 * m_intDimension * m_sqrCubeFace.Area;
            }
        }

        public float this[uint Index]
        {
            get
            {
                if (Index > m_fltAxisPos.Length)
                    throw new Exception("Index out of range.");

                return m_fltAxisPos[Index];
            }
            set
            {
                if (Index > m_fltAxisPos.Length)
                    throw new Exception("Index out of range.");

                m_fltAxisPos[Index] = value;
            }
        }
    }
    
    public class Cube : NCube
    {
        public Cube(float fltX, float fltY, float fltZ, float fltWidth)
            : base(fltX, fltY, fltZ, fltWidth, 3)
        {
        }
    }

    public class Cube4D/*Tansor*/ : NCube
    {
        protected float m_flt4D;

        public Cube4D(float fltX, float fltY, float fltZ, float flt4D, float fltWidth)
            : base(fltX, fltY, fltZ, fltWidth, 4)
        {
            base[4] = flt4D;
        }
    }


    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            button1.Top = 10;
            this.button1.Text = "&Calculate";
            this.Text = "Virtual Method and asbtract classes";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string l_strResult = string.Empty;
            double l_dblTotalAreaOfShapes = 0.0;

            Shape[] l_shpMyShapes = new Shape[2];
            
            l_shpMyShapes[0] = new Point2D(10, 20);
            l_shpMyShapes[1] = new Point3D(10, 20, 30);

            l_strResult += "Area of 2D point: " + l_shpMyShapes[0].GetArea() + "\n";
            l_strResult += "Area of 3D point: " + l_shpMyShapes[1].GetArea() + "\n";

            
            Shape2D[] l_shpSomeShapes = new Shape2D[6];

            l_shpSomeShapes[0] = new Cube(10, 15, 20, 11);
            l_shpSomeShapes[1] = new Cube4D(14, 15, 16, 22, 34);
            l_shpSomeShapes[2] = new Rectangel2D(21, 31, 44, 88);
            l_shpSomeShapes[3] = new Square2D(17, 18, 99);
            l_shpSomeShapes[4] = new NCube(12, 12 + 1, 14, 72, 21);
            l_shpSomeShapes[5] = new Point3D(10, 20, 30);

            l_strResult += "Area of Cube: " + l_shpSomeShapes[0].Area + "\n";

            foreach(Shape2D MyShape in l_shpSomeShapes)
                l_dblTotalAreaOfShapes += MyShape.Area;

            l_strResult += "Total Area of Shapes: " + l_dblTotalAreaOfShapes + "\n";

            MessageBox.Show(l_strResult, "Result", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

کلاسهای برنامه:
[تصویر:  Diagram.JPG]



یک نمونه از اجرای برنامه:
[تصویر:  Result.JPG]



توجه کنید می توانید حودتان یک کلاس شمارش پذیر به صورت دینامیک بسازید و از دستِ این آرایه ها خلاص شوید مانند مثال زیر:
کد:
using System.Collections;

// Declare the Tokens class:
public class Tokens : IEnumerable
{
    private string[] elements;

    Tokens(string source, char[] delimiters)
    {
        // Parse the string into tokens:
        elements = source.Split(delimiters);
    }

    // IEnumerable Interface Implementation:
    //   Declaration of the GetEnumerator() method
    //   required by IEnumerable
    public IEnumerator GetEnumerator()
    {
        return new TokenEnumerator(this);
    }


    // Inner class implements IEnumerator interface:
    private class TokenEnumerator : IEnumerator
    {
        private int position = -1;
        private Tokens t;

        public TokenEnumerator(Tokens t)
        {
            this.t = t;
        }

        // Declare the MoveNext method required by IEnumerator:
        public bool MoveNext()
        {
            if (position < t.elements.Length - 1)
            {
                position++;
                return true;
            }
            else
            {
                return false;
            }
        }

        // Declare the Reset method required by IEnumerator:
        public void Reset()
        {
            position = -1;
        }

        // Declare the Current property required by IEnumerator:
        public object Current
        {
            get
            {
                return t.elements[position];
            }
        }
    }


    // Test Tokens, TokenEnumerator
    static void Main()
    {
        // Testing Tokens by breaking the string into tokens:
        Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

        foreach (string item in f)
        {
            System.Console.WriteLine(item);
        }
    }
}
حالا شاید خودتان بخواهید یک کلاس سادهء شمارش پذیر و دینامیک به جای استفاده از آرایه برای احضار کردنِ فرزندان Shape استفاده کنید.

موفق باشی!
۳۰-بهمن-۱۳۸۵, ۰۷:۴۶:۲۱
وب سایت ارسال‌ها
پاسخ
pswin آفلاین
كاربر دو ستاره
**

ارسال‌ها: 151
موضوع‌ها: 11
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 0
( 19 تشکر در 11 ارسال )
ارسال: #5
RE: کلاس
متشکرم. سعید جان

۰۲-اسفند-۱۳۸۵, ۱۵:۵۹:۲۷
وب سایت ارسال‌ها
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  کلاس ارسال اس ام اس toopdanlod 1 2,945 ۱۱-آبان-۱۳۸۹, ۱۶:۲۲:۰۲
آخرین ارسال: WhiteNoise

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 3 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS