tags:

views:

89

answers:

4

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.

I am having issues however where the subclasses keep getting referenced in IntelliSense recursivelly (i.e.: 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]; }
        }
    }
}
+2  A: 

Since ParticipantTypeBudget is a subclass of ProgramBudget, it inherits all ProgramBudget's members, including all nested classes - hence, including itself.

The real question is, however: why exactly do you want them all to be nested classes? What benefit does that give you?

Fyodor Soikin
I suspect the OP didn't write all of those nested classes himself
Grant Crofton
Fyodor, my intention was to have everything contained within the ProgramBudget object. I wanted everything to be accessible from the ProgramBudget object within the form. Is this even possible or correct coding?
mattgcon
Yes, I understand that you wanted them all to be in ProgramBudger. But the question was: what benefit do you hope to get from such arrangement?
Fyodor Soikin
The benefit I was hope to achieve was to be able to instatiate one variable within the form "ProgramBudget" and access everything from that variable (i.e. ProgramBudget.ParticipantTypeBudget.ID)
mattgcon
Ok, matt, I see the problem: you're confusing *objects* and *classes*. Please read something on the subject before continuing with your project. I think this might be relevant: http://en.wikipedia.org/wiki/Class_(computer_science)
Fyodor Soikin
A: 

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.

Nathan Taylor
+5  A: 

ParticipantTypeBudget is a member of ProgramBudget. ParticipantTypeBudget also inherits ProgramBudget, which means it gets all of ProgramBudget's non-private members.

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.

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.

If you need a read-only property, i.e. one that can only be set by the object itself, make the set member protected:

public int MyProperty {
    get;
    protected set;
}
Mike Caron
I added examples of auto-properties for you.
Mike Caron
That is all there is to auto properties? that is pretty easy
mattgcon
Yup. Nice and easy. Just remember: if you add a body to either get or set, you HAVE to implement the other one as well.
Mike Caron
Mike,Can you do collections with auto properties? I have been searching and cant find anything on it
mattgcon
Yes, you can. Just make the type of the property be a collection, and away you go. This is one instance where the read-only property pattern is useful: The class creates the collection, and while external code can operate on the collection, they can't do something like TheObject.Collection = null.
Mike Caron
A: 

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. I am going to look at the auto properties and utilize that concept as well.

mattgcon