Я часто использую вложенные классы, чтобы скрыть детали реализации. Пример ответа Эрика Липперта здесь:
abstract public class BankAccount
{
private BankAccount() { }
// Now no one else can extend BankAccount because a derived class
// must be able to call a constructor, but all the constructors are
// private!
private sealed class ChequingAccount : BankAccount { ... }
public static BankAccount MakeChequingAccount() { return new ChequingAccount(); }
private sealed class SavingsAccount : BankAccount { ... }
}
Этот шаблон становится еще лучше с использованием обобщений. См. этот вопрос для двух интересных примеров. В итоге я пишу
Equality<Person>.CreateComparer(p => p.Id);
вместо
new EqualityComparer<Person, int>(p => p.Id);
Также у меня может быть общий список Equality<Person>
, но не EqualityComparer<Person, int>
var l = new List<Equality<Person>>
{
Equality<Person>.CreateComparer(p => p.Id),
Equality<Person>.CreateComparer(p => p.Name)
}
где как
var l = new List<EqualityComparer<Person, ??>>>
{
new EqualityComparer<Person, int>>(p => p.Id),
new EqualityComparer<Person, string>>(p => p.Name)
}
невозможно. Это преимущество наследования вложенного класса от родительского класса.
Другой случай (такой же природы - скрытие реализации) - это когда вы хотите сделать члены класса (поля, свойства и т. Д.) Доступными только для одного класса:
public class Outer
{
class Inner //private class
{
public int Field; //public field
}
static inner = new Inner { Field = -1 }; // Field is accessible here, but in no other class
}