代码之家  ›  专栏  ›  技术社区  ›  Jez

在C方法签名中是否有指定“当前类类型”的方法?

  •  0
  • Jez  · 技术社区  · 6 年前

    我试图定义一个抽象类,其他类将扩展这个抽象类,它们必须能够将自己序列化为JSON,并从JSON反序列化。我想编写这样的抽象类:

    public abstract class BaseApiModel {
        public abstract string ToJson();
        public abstract T FromJson(string json);
    }
    

    …在哪里? T 是当前类的类型。然后我将编写这样的扩展类:

    public class ContactApiModel : BaseApiModel {
        public string ContactName { get; set; }
        [...other properties...]
    
        public override string ToJson() {
            [...return serialized JSON string...]
        }
    
        public override ContactApiModel FromJson(string json) {
            [...return deserialized object...]
        }
    }
    

    当然不行,因为 T 在抽象类中没有定义。但是我是否可以用C语言写“这个方法必须返回当前类的类型”?我要把它还回去吗 object ?或者,我是不是犯了错误,有更好的方法来构建它?

    2 回复  |  直到 6 年前
        1
  •  5
  •   vinicius.ras    6 年前

    可以使用泛型声明基类,并在 ContactApiModel 班级刚刚设置了 T 参数待定 接触式模型 ,如下所示:

    public abstract class BaseApiModel<T> {
        ...
        public abstract T FromJson(string json);
    }
    
    
    public class ContactApiModel : BaseApiModel<ContactApiModel> {
        ...
        public override ContactApiModel FromJson(string json) {
            [...return deserialized object...]
        }
    }
    
        2
  •  0
  •   X39    6 年前

    对于未来的参观者:

    一个更聪明的解决方案是完全不在相应的类中实现该方法,而是使用扩展方法:

    public static class ExtendBaseApiModel
    {
        public static string ToJson(this T obj) { /* ... */ }
        public static T FromJson<T>(this T obj, string json) where T : BaseApiModel { /* ... */ }
    }
    

    这将使您的类保持良好和干净+不受序列化的影响。

    仍然…有话要说

    如何 判定元件 -正确序列化

    假设这样做是为了在 ToJson 方法和自定义反序列化 FromJson 方法,那么您不应该使用自己的古怪方法,而是让框架为您做这件事。

    为了 JSON.NET ,这应该通过使用 JsonConverter 属性并实现相应的 JsonConverter 在某处

    有趣的事实

    将扩展方法变量与上面提到的jsonConverter结合起来,只需调用 myobjvar.ToJson(...)