Nested Types
Type defined within class or struct which defaults to private as are called nested types. The access modifiers for nested types can be : public, protected, internal, protected internal, private, private proteted.
Nested types of a struct can be public, internal, or private.
class OuterClass
{
class InnerClass
{
Nested () {}
}
}
The nested, or inner, type can access the containing, or outer, type.
public class Container
{
public class Nested
{
private Container parent;
public Nested()
{
}
public Nested(Container parent)
{
this.parent = parent;
}
}
}
Container.Nested nest = new Container.Nested();
It is better approach to combine nested classes with the factory pattern.
public abstract class BankAccount
{
private BankAccount() {} // prevent third-party subclassing.
private sealed class SavingsAccount : BankAccount { ... }
private sealed class ChequingAccount : BankAccount { ... }
public static BankAccount MakeSavingAccount() { ... }
public static BankAccount MakeChequingAccount() { ... }
}
Complete control over all the code that runs in any bankaccount object.
Guidelines when not to use nested types:
- If the type needs to be instantiated by client code then do not use nested types
- If the type has public constructor
- Inner type should not be widely used outside
- References to the type are commonly declared in client code.