Tag: directed acyclic graphs

ReadOnlyCollection vs Liskov – 如何正确建模可变集合的不可变表示

Liskov替换原则要求子类型必须满足超类型的契约。 根据我的理解,这将导致ReadOnlyCollection违反Liskov。 ICollection的合同公开了Add和Remove操作,但只读子类型不满足此合约。 例如, IList collection = new List(); collection = new System.Collections.ObjectModel.ReadOnlyCollection(collection); collection.Add(new object()); — not supported exception 显然需要不可变的集合。 有没有关于.NET的建模方法的事情? 有什么比这更好的方法呢? IEnumerable很好地暴露了一个集合,至少看起来是不可变的。 但是,语义是非常不同的,主要是因为IEnumerable没有明确地暴露任何状态。 在我的特定情况下,我正在尝试构建一个不可变的DAG类来支持FSM 。 我显然在开始时需要AddNode / AddEdge方法,但我不希望它一旦运行就可以更改状态机。 我很难表示DAG的不可变和可变表示之间的相似性。 现在,我的设计涉及预先使用DAG Builder,然后创建一次不可变图,此时它不再可编辑。 Builder和具体的不可变DAG之间唯一的通用接口是Accept(IVisitor visitor) 。 我担心,面对可能更简单的选择,这可能是过度设计/过于抽象。 与此同时,我无法接受我可以在我的图形界面上公开可能在客户端获得特定实现时抛出NotSupportedException的方法。 处理这个问题的正确方法是什么?