具有类类型属性的抽象类

时间:2017-05-19 02:02:54

标签: c# json inheritance abstract-class

我正在反序列化一些JSON响应并将它们放入两个主类之一,具体取决于是返回单个对象还是返回对象列表。我正在使用

public class MultiResponse
{
    public List<DeserializedResult> Result { get; set; }
}

public class SingleResponse
{
    public DeserializedResult Result { get; set; }
}

public class DeserializedResult
{
    public string Id { get; set; }
    public string AccountName { get; set; }
}

包含响应。但是我知道这不是最好的方法,特别是因为我不得不在调用类中使用动态返回来处理可能的两种类型的响应。我认为抽象类(或接口?)是一种更好的方法,但我不知道如何实现它。我是在正确的轨道上吗?如果是这样,我如何构造抽象类并进行继承?

2 个答案:

答案 0 :(得分:0)

基于多个响应创建设计 - 即,即使只有一个对象,也可以保留/返回列表。它消除了某种特殊情况的设计“提示”。结果代码将更加一致和健壮。

重点应放在物体本身 - 重新补水后你用它做什么。不是因为我有一个或多个对象的琐碎事件。这种区别与“4个物体或4个物体”没有什么不同。

将容器抽象为单个类必然会使对象成为焦点,也是设计的重点。

修改

这样想。单个或多个反序列化对象是反序列化的对象数量的结果。它是一个与(反序列化)对象实际使用没有密切关系的实现细节。 封装实施细节,即将其隐藏在客户端代码中。为客户提供以“业务领域”术语表达功能的类和方法。

结束修改

修改

  

...我必须在调用类中使用动态返回来处理可能的两种类型的响应。我认为抽象类(或接口?)是一种更好的方法,但我不知道如何实现它。

要点:

  • ClientApi将反序列化的对象转换为所需的类。

    • 两个API!
      • 由脱水对象调用的构造函数
      • 隐藏默认构造函数以确保有效的对象实例化
      • GetDeHydratedJsonThingy由“使用”客户端调用。
  • 由于ClientApi类,反序列化器和“使用”客户端已解耦。

    • 脱水适用于DeserializedResults个对象
    • “使用”客户端仅关注MultipleResponse个对象
  • “使用”客户端只处理一种返回类型。

P.S。在我写完之后,我意识到只需要一个“Response”类,现在ClientApi类封装了对象实例化。注释掉的代码是原创的。

P.P.S。我的方法和参数名称真的很糟糕。使用在问题域中具有意义的名称。即用户的术语。

public class ClientApi {
    protected MultiResponse MoreThanOne { get; set; }
    // protected SingleResponse OnlyOne    { get; set; }

    protected ClientApi ( );

    public ClientApi (List<DeserializedResult> theList) {
        if (theList == null) throw ArgumentNullException("error message here");

        // add overloaded constructors to MultiResponse class.
        MoreThanOne = new MultiResponse (theList);
       // OnlyOne = null;
    }

    public ClientApi (DeserializedResult onlyOne)
        if (onlyOne == null) throw ArgumentNullException("error message here");

        MoreThanOne = new MultiResponse(onlyOne);
       // OnlyOne = onlyOne;
    }

    ///<summary>
    /// Always returns an object. The list may be empty, 
    /// but never null
    ///</summary>
    public MultiResponse GetDeHydratedJsonThingy() {
        MultiResponse HereYaGo = new MultiResponse();
      //  if (MoreThanOne !=null) HereYaGo.AddRange(MoreThanOne);
      //  if (OnlyOne != null) HereYaGo.Add(OnlyOne);

        HereYaGo.AddRange(MoreThanOne.Result);
        return HereYaGo;
    }
}

结束修改

答案 1 :(得分:0)

您可以使用通用基本抽象类

尝试以下操作
public abstract class Response<T> {
    public T Result { get; set; }
}

具体实现将继承公共基础响应。

public class Response : Response<object> {
    public object Result { get; set; }
}

public class MultiResponse : Response<List<DeserializedResult>> {
    public List<DeserializedResult> Result { get; set; }
}

public class SingleResponse : Response<DeserializedResult> {
    public DeserializedResult Result { get; set; }
}