Вы можете добавить некоторые дженерики. Подходит лучше, прочнее в сочетании.
public interface IBucket<T> where T : INail
{
Collection<T> Nails
{
get;
}
}
public interface INail
{
}
internal sealed class Nail : INail
{
}
internal sealed class Bucket : IBucket<Nail>
{
private Collection<Nail> nails;
Collection<Nail> IBucket<Nail>.Nails
{
get
{
return nails; //works
}
}
public Bucket()
{
this.nails = new Collection<Nail>();
}
}
Таким образом, Collection<Nail>
, который вы возвращаете из класса Bucket
, может содержать только Nail
с. Любой другой INail
не пойдет на это. Это может быть или не быть лучше в зависимости от того, что вы хотите.
Только если вы хотите, чтобы Collection<INail>
(свойство интерфейса) вы возвращали из Bucket
для хранения других INail
с (кроме Nail
с), тогда вы можете попробовать следующий подход. Но есть проблема. С одной стороны вы говорите, что хотите использовать private Collection<Nail>
в Bucket
классе, а не Collection<INail>
, потому что вы не хотите случайно добавлять в него другие INail
s из Bucket
класса, но с другой стороны вы будете должны добавить другие INail
с за пределами Bucket
класса. Это невозможно в одном экземпляре . Компилятор останавливает случайное добавление INail
к Collection<Nail>
. Один из способов - вернуть экземпляр Collection<INail>
из вашего класса Bucket
из существующего Collection<Nail>
. Это менее эффективно, но может быть семантикой, к которой вы стремитесь. Обратите внимание, что это концептуально отличается от описанного выше
internal sealed class Bucket : IBucket
{
private Collection<Nail> nails;
Collection<INail> IBucket<Nail>.Nails
{
get
{
List<INail> temp = new List<INail>();
foreach (Nail nail in nails)
temp.Add(nail);
return new Collection<INail>(temp);
}
}
public Bucket()
{
this.nails = new Collection<Nail>();
}
}