C# - 创建可保存的对象

4
我想创建一个类库,其中包含一个接口,对象可以从中派生,比如说ISaveableObject
现在,这个接口应该实现以下功能:
  • 从这个接口派生的对象应该有一个ToSaveableObject方法(类似于System.Object.ToString()方法)。
  • 它应该包含一个特定的构造函数,该构造函数以对象数组作为其参数。
这两者之间的联系是,ToSaveableObject方法返回一个字符串,该字符串获取需要用于object[]的所有属性并将其转换为可读字符串并返回它。
我是否通过想要使用接口来朝着正确的方向前进,还是抽象类更适合这种情况?
遗憾的是,接口不能实现构造函数,所以有没有其他方法可以实现我的目标?

使用从您的接口继承的抽象基类。您想要的是更多的实现细节,这超出了接口可以提供的范畴。 - Nkosi
1
接口没有“应该实现”,但可能存在“应该计划合同”。 - Jacek Cz
我不理解“应该有特定的构造函数”。可保存或可序列化的解决方案世界从来不需要“特定的构造函数”,但许多人至少希望有受保护的无参构造函数。通过代码讨论会更好。 - Jacek Cz
现在有一个 ToString 和一个 ToSaveableObject,它们都返回描述调用它们的对象的字符串。这是否过度了? - Sweeper
1
ToString始终是“人性化”的,结果不能反向使用。 - Jacek Cz
1个回答

1
使用抽象基类来形成派生类的契约。你想要的是更多的实现细节,这超出了接口所能提供的范畴。
抽象基类可能会像这样:
public abstract class SaveableObject {
    protected object[] parameters = new object[0];

    protected SaveableObjectBase(object[] objects) {
        this.parameters = objects;
    }

    public abstract string ToSaveableObject();
}

现在派生类必须实现ToSaveableObject()方法,并且可以访问构造函数中传递的对象来生成字符串。
如果ToSaveableObject方法的构造算法对于所有派生类型都相同,则应该在基础抽象类中实现该方法,以便所有派生类已经内置了该功能。

你的答案向我表明了解决方案的两个部分是独立的。可能我会写类似的代码,但这只是由于坏设计决策所导致的结果。 - Jacek Cz
2
@IanH. 字段是受保护的,因此可以在派生类中访问。您可以考虑使用“readonly”进行一次初始化(第一次分配错误)。 - Jacek Cz
1
我将要实现一个通用的 ToSaveableObject() 函数,因此虚方法可能更好,因为它不需要被覆盖。 - Ian H.
1
@diemaus 对抽象类的引用将代码与特定实现耦合在一起,这违反了SOLID原则。对接口的引用不会与该接口的特定实现绑定。 - Mick
2
@diemaus 嗯,这是一个观点问题。我不同意。引用基类意味着你只能用继承基类的其他实现来替换实现和基类内所有功能。通常情况下,明确引用接口而不是类会给你更大的灵活性和能力,可以用完全不同的实现替换对象,并更好地符合Liskov替换原则。 - Mick
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接