简体   繁体   English

C#自定义类集合的混乱

[英]C# Custom class collection confusion

The following is my custom class, with collections. 以下是我的自定义类和集合。 My application is an MDI app with the ability to open a "Program" form multiple times for multiple programs and I want to use the ProgramBudget class but I want all of the "subclasses" within the Program budget to be contained within the Program form ProgramBudget class. 我的应用程序是MDI应用程序,能够为多个程序多次打开“程序”表单,我想使用ProgramBudget类,但我希望程序预算中的所有“子类”都包含在程序表单ProgramBudget中类。

I am having issues however where the subclasses keep getting referenced in IntelliSense recursivelly (ie: ProgramBudget.ParticipantTypeBudget.ParticipantTypeBudget.ParticipantTypeBudget...) 但是我遇到的问题是子类在递归引用中不断被IntelliSense引用(即:ProgramBudget.ParticipantTypeBudget.ParticipantTypeBudget.ParticipantTypeBudget ...)

What is wrong with this class and how do i work with it, the custom class is below: 该类有什么问题以及如何使用它,自定义类如下:

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

namespace IPAM_NSF_Financials.Application_Classes
{
    public class ProgramBudget
    {
        internal string strProgramCode;
        private string strActualTravelSourceRefCode;
        private string strActualExpenseSourceRefCode;
        private string strProgramBudgetComment;
        private string strParticipantComment;
        private decimal decInitTravel;
        private decimal decInitLodging;
        private decimal decInitStipend;
        private decimal decRemTravel;
        private decimal decRemLodging;
        private decimal decRemStipend;
        private decimal decPartTypeTravel;
        private decimal decPartTypeExpenses;
        private decimal decPartPrimTravelBudget;
        private decimal decPartPrimExpenseBudget;
        private decimal decPartPrimRegFee;
        private decimal decActualTravelAir;
        private decimal decActualTravelGround;
        private decimal decActualTravelMisc;
        private decimal decActualExpenseLodging;
        private decimal decActualExpenseCatering;
        private decimal decActualExpenseMisc;
        private int nProgramBudgetID;
        private int nParticipantTypeBudgetID;
        private int nParticipantBudgetHDRID;
        private int nParticipantBudgetHDRCommentID;
        private int nParticipantBudgetDTLID;
        private int nParticipantBudgetDTLExpenseID;
        private int nParticipantBudgetDTLTravelID;
        private int nPartType;
        private int nParticipant;
        private int nActualTravelSource;
        private int nActualExpenseSource;

        public int ProgramBudgetID
        {
            get { return nProgramBudgetID; }
            set { nProgramBudgetID = value; }
        }

        public string ProgramCode
        {
            get { return strProgramCode; }
            set { strProgramCode = value; }
        }

        public decimal InitialTravel
        {
            get { return decInitTravel; }
            set { decInitTravel = value; }
        }

        public decimal InitialLodging
        {
            get { return decInitLodging; }
            set { decInitLodging = value; }
        }

        public decimal InitialStipend
        {
            get { return decInitStipend; }
            set { decInitStipend = value; }
        }

        public decimal RemainingTravel
        {
            get { return decRemTravel; }
            set { decRemTravel = value; }
        }

        public decimal RemainingLodging
        {
            get { return decRemLodging; }
            set { decRemLodging = value; }
        }

        public decimal RemainingStipend
        {
            get { return decRemStipend; }
            set { decRemStipend = value; }
        }

        public string ProgramBudgetComment
        {
            get { return strProgramBudgetComment; }
            set { strProgramBudgetComment = value; }
        }

        public class ParticipantTypeBudget : ProgramBudget
        {
            public int ParticipantTypeBudgetID
            {
                get { return nParticipantTypeBudgetID; }
                set { nParticipantTypeBudgetID = value; }
            }

            public int ParticipantType
            {
                get { return nPartType; }
                set { nPartType = value; }
            }

            public decimal ParticipantTypeTravel
            {
                get { return decPartTypeTravel; }
                set { decPartTypeTravel = value; }
            }

            public decimal ParticipantTypeExpenses
            {
                get { return decPartTypeExpenses; }
                set { decPartTypeExpenses = value; }
            }
        }

        class ParticipantTypeBudgets : CollectionBase
        {
            public void Add(ParticipantTypeBudget partTypeBudgetObject)
            { InnerList.Add(partTypeBudgetObject); }

            public void Remove(int Index)
            { InnerList.RemoveAt(Index); }

            public ParticipantTypeBudget Item(int Index)
            { return (ParticipantTypeBudget)InnerList[Index]; }
        }

        public class ParticipantPrimaryBudget : ProgramBudget
        {
            public int ParticipantBudgetHDRID
            {
                get { return nParticipantBudgetHDRID; }
                set { nParticipantBudgetHDRID = value; }
            }

            public int ParticipantID
            {
                get { return nParticipant; }
                set { nParticipant = value; }
            }

            public string ParticipantBudgetComment
            {
                get { return strParticipantComment; }
                set { strParticipantComment = value; }
            }

            public decimal ParticipantPrimaryTravelBudget
            {
                get { return decPartPrimTravelBudget; }
                set { decPartPrimTravelBudget = value; }
            }

            public decimal ParticipantPrimaryExpenseBudget
            {
                get { return decPartPrimExpenseBudget; }
                set { decPartPrimExpenseBudget = value; }
            }

            public decimal ParticipantPrimaryRegFee
            {
                get { return decPartPrimRegFee; }
                set { decPartPrimRegFee = value; }
            }
        }

        public class ParticipantActualTravelBudget : ProgramBudget
        {
            public int ParticipantBudgetDTLID
            {
                get { return nParticipantBudgetDTLID; }
                set { nParticipantBudgetDTLID = value; }
            }

            public int ParticipantBudgetDTLTravelID
            {
                get { return nParticipantBudgetDTLTravelID; }
                set { nParticipantBudgetDTLTravelID = value; }
            }

            public int FundingSource
            {
                get { return nActualTravelSource; }
                set { nActualTravelSource = value; }
            }

            public string ReferenceCode
            {
                get { return strActualTravelSourceRefCode; }
                set { strActualTravelSourceRefCode = value; }
            }

            public decimal Air
            {
                get { return decActualTravelAir; }
                set { decActualTravelAir = value; }
            }

            public decimal Ground
            {
                get { return decActualTravelGround; }
                set { decActualTravelGround = value; }
            }

            public decimal Miscellaneous
            {
                get { return decActualTravelMisc; }
                set { decActualTravelMisc = value; }
            }
        }

        class ParticipantActualTravelBudgets : CollectionBase
        {
            public void Add(ParticipantActualTravelBudget partActTravelBudgetObject)
            { InnerList.Add(partActTravelBudgetObject); }

            public void RemoveAt(int Index)
            { InnerList.RemoveAt(Index); }

            public ParticipantActualTravelBudget Item(int Index)
            { return (ParticipantActualTravelBudget)InnerList[Index]; }
        }

        public class ParticipantActualExpensesBudget : ProgramBudget
        {
            public int ParticipantBudgetDTLID
            {
                get { return nParticipantBudgetDTLID; }
                set { nParticipantBudgetDTLID = value; }
            }

            public int ParticipantBudgetDTLExpenseID
            {
                get { return nParticipantBudgetDTLExpenseID; }
                set { nParticipantBudgetDTLExpenseID = value; }
            }

            public int FundingSource
            {
                get { return nActualExpenseSource; }
                set { nActualExpenseSource = value; }
            }

            public string ReferenceCode
            {
                get { return strActualExpenseSourceRefCode; }
                set { strActualExpenseSourceRefCode = value; }
            }

            public decimal Lodging
            {
                get { return decActualExpenseLodging; }
                set { decActualExpenseLodging = value; }
            }

            public decimal Catering
            {
                get { return decActualExpenseCatering; }
                set { decActualExpenseCatering = value; }
            }

            public decimal Miscellaneous
            {
                get { return decActualExpenseMisc; }
                set { decActualExpenseMisc = value; }
            }
        }

        class ParticipantActualExpenseBudgets : CollectionBase
        {
            public void Add(ParticipantActualExpensesBudget partActExpensesBudgetObject)
            { InnerList.Add(partActExpensesBudgetObject); }

            public void RemoveAt(int Index)
            { InnerList.RemoveAt(Index); }

            public ParticipantActualExpensesBudget Item(int Index)
            { return (ParticipantActualExpensesBudget)InnerList[Index]; }
        }
    }
}

ParticipantTypeBudget is a member of ProgramBudget . ParticipantTypeBudgetProgramBudget的成员。 ParticipantTypeBudget also inherits ProgramBudget , which means it gets all of ProgramBudget 's non-private members. ParticipantTypeBudget还继承了ProgramBudget ,这意味着它将获取ProgramBudget的所有非私有成员。

See the problem? 看到问题了吗?

class Foo {
    class Bar : Foo {

    }
}

//perfectly legal:
Foo.Bar.Bar.Bar.Bar.Bar = new Foo.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar();

To get rid of this recursion, move ParticipantTypeBudget , etc out of ProgramBudget . 要摆脱此递归,请将ParticipantTypeBudget等移出ProgramBudget

EDIT: Also, you asked about auto properties. 编辑:另外,您询问了自动属性。 Those are properties that don't have explicit backing fields. 这些是没有显式后备字段的属性。 I use two patterns: 我使用两种模式:

For a read/write property, you do this: 对于读/写属性,请执行以下操作:

public int MyProperty {
    get;
    set;
}

Note that both get and set must not have a body. 请注意,get和set都不能有主体。

If you need a read-only property, ie one that can only be set by the object itself, make the set member protected: 如果需要只读属性,即只能由对象本身设置的属性,则将set成员设置为受保护的:

public int MyProperty {
    get;
    protected set;
}

Since ParticipantTypeBudget is a subclass of ProgramBudget , it inherits all ProgramBudget 's members, including all nested classes - hence, including itself. 由于ParticipantTypeBudgetProgramBudget的子类,因此它继承了所有ProgramBudget的成员,包括所有嵌套的类-因此包括其自身。

The real question is, however: why exactly do you want them all to be nested classes? 但是,真正的问题是:为什么您要它们全部都嵌套为类? What benefit does that give you? 这给您带来什么好处?

Your derived types are children of their base type thus creating an infinitely recursive parent-child relationship. 您的派生类型是其基本类型的子代,因此创建了无限递归的父子关系。 Move the derived child classes into their own independent class in order to eliminate the infinite nesting. 将派生的子类移到其自己的独立类中,以消除无限嵌套。

I apologize everyone for wasting your time everyone. 我为大家浪费时间致歉。 I have been sick and I wasnt thinking clearly when I created this class. 我生病了,当我创建这个课程时,我并没有想清楚。 I completely understand the recurvsive thing now, a nd I should have created custom classes for each of the sub classes outside of the ProgramBudget class and created a property within the ProgramBudget for each of the sub classes. 现在,我完全理解了递归的内容,并且我应该为ProgramBudget类之外的每个子类创建自定义类,并为每个子类在ProgramBudget中创建一个属性。 I am going to look at the auto properties and utilize that concept as well. 我将研究自动属性,并利用该概念。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM