程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 自定義集合實體類

自定義集合實體類

編輯:C++入門知識

概述

對於實體層,在學習三層架構的時候,我們大家都接觸過,並且在之後的項目中也運用過,我們也知道,在層和層之間傳遞的是實體或者是實體集合,那麼,在這裡問一下大家,你們是如何構建自己的實體集的呢?是通過數組,是通過系統提供的集合,或者是自己針對於每個實體都創建一個自己的集合(每個集合和都是一個套代碼),還是其它的方法。

本片博客,本人會通過實例向大家闡釋兩種方式,這兩種方式都是創建自己的實體集合類,但是,這兩種方式也是非常不一樣的。

復用性差的實體集合類

該方式是為每一個實體類創建一個實體集合類,並且,每個實體集合類裡面的功能是一樣的,那麼,每個實體集合類的不同之處是什麼呢?他們的不同之處就是,他們具體的服務對象的類型是固定的。下面是一個實例,大家可以看一下。

實體類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using 集合.集合.靈活性差的ORMapping;

namespace TableToCollection.實體
{
    public class Person
    {
        public string strID { get; set; }
        public string strName { get; set; }
        public int intAge { get; set; }
    }

}

實體集合類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using TableToCollection.實體;

namespace TableToCollection.集合.靈活性差的集合
{
    public class PersonCollection_bad:IEnumerable
    {

        private ArrayList list;

        public int Count 
        {
            get { return list.Count; }
        }

        #region 構造函數
        public PersonCollection_bad()
        {
            list = new ArrayList();
        }

        #endregion
        
        #region 添加
        public void Add(Person p)
        {
            this.list.Add(p);
        }
        public void AddAr(Person[] ps) 
        {
            this.list.AddRange(ps);
        }
        #endregion

        #region 刪除
        public void Remove(Person p) 
        {
            this.list.Remove(p);
        }
        public void RemoveAt(int index) 
        {
            this.list.RemoveAt(index);
        }
        public void RemoveRange(int index, int count) 
        {
            this.list.RemoveRange(index, count);
        }
        public void Clear() {
            this.list.Clear();
        }
        #endregion

        #region 自定義索引器
        public Object this[int index]
        {
            get
            {
                return list[index];
            }
            set
            {
                list[index] = value;
            }
        }     
        #endregion

        #region 支持foreach語句遍歷
        public IEnumerator GetEnumerator() 
        {
            return list.GetEnumerator();
        }
        #endregion
    }
}

復用性好的實體集合類

對於上面實體集合類的缺點,我們通過泛型的方式解決,也就是類型後綁定的方式。具體思路,創建一個基礎實體集合類,然後,將具體集合類繼承這個類,並且指定相應的類型,從而達到代碼的復用性號,程序的安全性號的目的。實體類使用上面的實體類。

基礎實體集合類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 集合.集合.靈活性好的集合
{
    public class BaseCollection:IEnumerable,IEnumerator,IList
    {
        private List list;
        //定義索引
        private int position;

        public int Count 
        {
            get {
                if (list != null)
                {
                    return list.Count;
                }
                return -1;
            }
        }
        
        /// 
        /// 確定集合中特定對象的索引
        /// 
        /// 特定的對象
        /// 如果在列表中找到,則為item 的索引;否則為 -1
        public int IndexOf(T TObject) 
        {
            return this.list.IndexOf(TObject);
        }

        #region 構造方法
        public BaseCollection(){
            this.list = new List();
            this.position = -1;
        }
        #endregion
        
        #region 添加
        /// 
        /// 將對象添加到集合的尾部
        /// 
        /// 要添加到集合尾部的對象
        public void Add(T TObject)
        {
            this.list.Add(TObject);
        }
        /// 
        /// 將指定集合裡的元素添加到集合尾部
        /// 
        /// 要添加到集合尾部的集合對象
        public void AddRange(ICollection TCollection)
        {
            this.list.AddRange(TCollection);
        }
        #endregion

        #region 刪除
        /// 
        /// 從集合中移除特定對象的第一個匹配項
        /// 
        /// TObject
        /// true:移除成功;false:移除失敗
        public bool Remove(T TObject) {
            return this.list.Remove(TObject);
        }
        /// 
        /// 從集合中移除指定索引處的對象
        /// 
        /// 索引值,從0開始
        public void RemoveAt(int index)
        {
            this.list.RemoveAt(index);
        }
        /// 
        /// 集合刪除所有對象
        /// 
        public void Clear() {
            this.list.Clear();
        }
        #endregion

        #region 插入
        /// 
        /// 在集合的特定位置插入對象
        /// 
        /// 索引,從0開始
        /// 被插入的對象
        public void Insert(int index, T TObject)
        {
            this.list.Insert(index, TObject);
        }
        #endregion

        #region 取值
        /// 
        /// 獲取或設置指定索引處的元素
        /// 
        /// 索引值從0開始
        /// TObject
        public T this[int index] 
        {
            get
            {
                return this.list[index];
            }
            set 
            {
                this.list[index] = value; 
            }
        }
        #endregion

        #region 實現ICollection,因為IList繼承ICollection
        //獲取一個值,該值指示 System.Collections.Generic.ICollection 是否為只讀。
        public bool IsReadOnly
        {
            get
            {
                return true;
            }
        }      
        //確定 System.Collections.Generic.ICollection 是否包含特定值。
        public bool Contains(T item)
        {
            return this.list.Contains(item);
        }        
        //從特定的 System.Array 索引處開始,將 System.Collections.Generic.ICollection 的元素復制到一個
        public void CopyTo(T[] array, int arrayIndex) 
        { 
            this.list.CopyTo(array, arrayIndex); 
        }
        #endregion        

        #region 支持foreach語句遍歷
        #region 實現IEnumerable接口
        System.Collections.Generic.IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() 
        {
            return (System.Collections.Generic.IEnumerator)this;
        }

        #region 實現IEnumerable接口,因為IEnumerable繼承IEnumerable
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
        {
            return (System.Collections.IEnumerator)this;
        }
        #endregion
        #endregion

        #region 實現IEnumerator接口
        //獲取集合中的當前元素。
        T System.Collections.Generic.IEnumerator.Current
        {
            get {
                try
                {
                    return this.list[position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }

        #region 實現IEnumerator接口,因為IEnumerator繼承IEnumerator
        //獲取集合中的當前元素。
        object System.Collections.IEnumerator.Current
        {
            get
            {
                try
                {
                    return this.list[position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }
        //將枚舉數推進到集合的下一個元素。
        bool System.Collections.IEnumerator.MoveNext()
        {
            this.position++;            
            return (this.position < this.list.Count);
        }
        //將枚舉數設置為其初始位置,該位置位於集合中第一個元素之前。
        void System.Collections.IEnumerator.Reset()
        {
            this.position = -1;
        }      
        #endregion

        #region 實現IDisposable接口,因為IEnumerator繼承IDisposable
        public void Dispose()
        {
            this.position = -1;
        }
        #endregion
        #endregion
        #endregion
    }
}

具體實體集合類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TableToCollection.實體;

namespace 集合.集合.靈活性好的集合
{
    public class PersonBaseCollection:BaseCollection
    {        
    }
}

客戶端代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TableToCollection.實體;
using TableToCollection.集合.靈活性差的集合;
using 集合.集合.靈活性好的集合;
using 集合.靈活性差的ORMapping.ORMapping;

namespace 集合
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 靈活性差的集合
            //#region 靈活性差的集合
            //PersonCollection_bad personCollection = new PersonCollection_bad();
            ////集合添加元素
            //for (int i = 0; i < 10; i++)
            //{
            //    Person p = new Person() { strID=i.ToString(),strName="zhang",intAge=i};
            //    personCollection.Add(p);
            //}

            //Console.WriteLine("元素個數:"+personCollection.Count);

            ////輸出集合
            //Console.WriteLine("使用foreach輸出");
            //foreach (var item in personCollection)
            //{
            //    Console.WriteLine(((Person)item).strID + ((Person)item).strName + ((Person)item).intAge);
            //}
            //Console.WriteLine("使用for輸出");
            //for (int i = 0; i < personCollection.Count; i++)
            //{
            //    Console.WriteLine(((Person)personCollection[i]).strID + ((Person)personCollection[i]).strName + ((Person)personCollection[i]).intAge);
            //}
            //#endregion
            #endregion
            
            #region 靈活性好的集合
            PersonBaseCollection personBaseCollection = new PersonBaseCollection();

            DoAdd(personBaseCollection);
            DoForPrint(personBaseCollection);

            DoInsert(0,personBaseCollection);
            DoForEachPrint(personBaseCollection);

            personBaseCollection.RemoveAt(1);
            DoForEachPrint(personBaseCollection);

            personBaseCollection.Clear();
            DoForEachPrint(personBaseCollection);            
            #endregion
            
            
            Console.ReadKey();
        }

        static void DoAdd(PersonBaseCollection personBaseCollection)
        {
            personBaseCollection.Add(new Person() { strID = "1", strName = "qs1(Add)", intAge = 21 });

            Person[] persons = { new Person() { strID = "2", strName = "qs2(AddRange)", intAge = 22 }, new Person() { strID = "3", strName = "qs3(AddRange)", intAge = 23 } };
            personBaseCollection.AddRange(persons);

        }

        static void DoInsert(int index, PersonBaseCollection personBaseCollection)
        {
            personBaseCollection.Insert(index, new Person() { strID = "4", strName = "qs4(Insert)", intAge = 24 });
        }

        static void DoForPrint(PersonBaseCollection personBaseCollection)
        {            
            Console.WriteLine("For語句輸出:");
            if (personBaseCollection.Count == 0)
            {
                Console.WriteLine("集合裡面沒有元素!");
                return;
            }
            for (int i = 0; i < personBaseCollection.Count; i++)
            {
                Console.WriteLine(personBaseCollection[i].strID + "    " + personBaseCollection[i].strName + "    " + personBaseCollection[i].intAge);
            }
        }

        static void DoForEachPrint(PersonBaseCollection personBaseCollection) {
            Console.WriteLine("ForEach語句輸出:");
            if (personBaseCollection.Count == 0)
            {
                Console.WriteLine("集合裡面沒有元素!");
                return;
            }
            foreach (var item in personBaseCollection)
            {
                Console.WriteLine(item.strID +"    "+ item.strName +"    "+ item.intAge);
            }
        }
    }
}

總結

上面說的內容中還有一塊沒有說,就是迭代器設計模式,其實上面的程序中已經運用了,只不過相應的接口是微軟給定義好的,為什麼微軟給定義好了的呢?因為微軟自己也要用(.net framework提供的具體集合類)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved