【问题标题】:C# - Creating a saveable objectC# - 创建一个可保存的对象
【发布时间】:2016-09-11 12:44:54
【问题描述】:

我想创建一个类库,其中包含一个对象可以派生的接口,比如说ISaveableObject

现在,这个接口应该实现以下功能:

  • 从这个接口派生的对象应该有一个方法ToSaveableObject(类似于System.Object.ToString()方法)。
  • 它应该包含一个特定的构造函数,它以一个对象数组作为其参数。

这两者之间的联系应该是ToSaveableObject方法返回一个字符串,该字符串取object[]所需的所有属性,并将其转换为可读字符串并返回。

我想要使用接口是朝着正确的方向前进,还是抽象类更适合这种情况?

遗憾的是,接口无法实现构造函数,那么还有其他方法可以实现我的目标吗?

【问题讨论】:

  • 使用继承自预期接口的抽象基类。你想要的是更多的实现细节,而不是接口所能提供的。
  • 接口没有“应该实施”但也许“应该计划合同”
  • 我不明白“应该有特定的构造函数”。 “可保存”或“可序列化”解决方案的世界从不需要“特定构造函数”,许多人至少希望没有 args ctor。有代码讨论会更好
  • 所以现在有一个ToString 和一个ToSaveableObject,它们都返回一个描述它们被调用的对象的字符串。是不是过分了?
  • ToString 一直感觉“人性化”,结果不能反向使用

标签: c# .net oop


【解决方案1】:

使用抽象基类来形成派生类的契约。你想要的是更多的实现细节,而不是接口所能提供的。

抽象基类可能是这样的

public abstract class SaveableObject {
    protected object[] parameters = new object[0];

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

    public abstract string ToSaveableObject();
}

所以现在派生类必须实现ToSaveableObject() 方法,并且可以访问构造函数中传递的对象以生成字符串。

如果ToSaveableObject 方法的构造算法对于所有派生类型都相同,那么您应该只在基抽象类中实现该方法,以便所有派生类都具有已经内置的功能。

【讨论】:

  • 您的回答(对我而言)是一个标志,即解决方案的两半都是独立的。可能我会编写类似的代码,但这是错误设计决策的结果
  • @IanH。字段受保护,因此可以在派生类中访问。您可以考虑“只读”一次且仅初始化一次(第一次分配错误)
  • 我要实现一个通用的ToSaveableObject()函数,所以虚拟方法可能会更好,因为它不必被覆盖。
  • @diemaus 对抽象类的引用将代码与特定实现结合起来,这不符合 SOLID 原则en.wikipedia.org/wiki/SOLID_(object-oriented_design)。对接口的引用与该接口的特定实现无关。
  • @diemaus 好吧,这是一个见仁见智的问题。我不同意。引用基类意味着您只能将实现替换为继承基类和基内所有功能的其他实现。通常,明确引用接口而不是类将为您提供更大的灵活性和用完全不同的实现替换对象的能力,并且更符合 Liskov 替换原则
猜你喜欢
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多