Один из способов достижения этой цели - не разрешать внешним абонентам создавать экземпляры NoteChart и иметь метод в Simfile, который создает и возвращает экземпляры NoteChart, которые уже подключены к экземпляру Simfile.
Здесьупрощенный пример, обратите внимание, что я не добавлял никакой проверки ошибок для дублирующих идентификаторов и т. д.
public class NoteChart
{
public SimFile Owner {get; private set;}
public string Id { get; private set; }
internal NoteChart(SimFile owner, string id)
{
this.Owner = owner;
this.Id = id;
Owner.Add(id, this);
}
}
public class SimFile : Dictionary<string, NoteChart>
{
public NoteChart CreateNoteChart(string id)
{
NoteChart noteChart = new NoteChart(this, id);
return noteChart;
}
}
В таком случае это будет выглядеть примерно так: 10000
// Get instance of SimFile somehow. I just newed it here for the example
SimFile sim = new SimFile();
// Create a new NoteChart on the SimFile
NoteChart chart = sim.CreateNoteChart("NoteChart-1");
1008Конструктор NoteChart помечен как внутренний.Это означает, что другие классы в других сборках не смогут напрямую создавать экземпляры класса
NoteChart
и будут вынуждены работать через метод
SimFile.CreateNoteChart
.
В той же сборке код все еще может вызывать конструктор internal
, но ему придется передать собственные SiteFile и Id, и конструктор добавит NoteChart в SimFile.
Возможно, вы захотите пересмотреть проектный выбор наследования SimFile из словаря, может быть, лучше просто включить словарь в качестве члена и предоставить требуемую функциональность.Например, теперь NoteChart может быть случайно добавлен непосредственно в другой экземпляр SimFile через SimFle.Add, который унаследован от Dictionary, и с несовпадающим идентификатором.Но это всего лишь пища для размышлений.