c#抽象继承问题

jxllove 2017-04-19 12:24:32
各位大神好,小菜我想请教下如何把一些类进行抽象,大概需求如下:程序需要调用restful + json的api,有好多个,想把request,response等对象通过继承,抽象等方式将代码进行简化,还望大神指教下。(request和response都是json格式的,我是通过json生成c#代码生成的实体)
比如1:
{
"Request": {
"Header": {
"SourceSystem": "",
"MessageID": ""
},
"Body": {
"SpecimenReceiveRt": {
"LISAppNum": "",
"OrderItemID": "",
"ExecUserCode": "",
"SpeciReceiveDate": "",
"SpeciReceiveTime": ""
}
}
}
}

namespace TestInterface.Model.SpecimenReceive.Req
{
public class Header
{
public string SourceSystem { get; set; }
public string MessageID { get; set; }
}
public class SpecimenReceiveRt
{
public string LISAppNum { get; set; }
public string OrderItemID { get; set; }
public string ExecUserCode { get; set; }
public string SpeciReceiveDate { get; set; }
public string SpeciReceiveTime { get; set; }
}
public class Body
{
public SpecimenReceiveRt SpecimenReceiveRt { get; set; }
}
public class Request
{
public Header Header { get; set; }
public Body Body { get; set; }
}
public class SpecimenReceive_Req
{
public Request Request { get; set; }
}
}

比如2:
{
"Request": {
"Header": {
"SourceSystem": "",
"MessageID": ""
},
"Body": {
"LaboratoryReportAccomplishRt": {
"LISAppNum": "",
"OrderItemID": "",
"ReportLink": "",
"UpdateUserCode": "",
"UpdateDate": "",
"UpdateTime": ""
}
}


namespace TestInterface.Model.LaboratoryReportAccomplish.Req
{
public class Header
{
public string SourceSystem { get; set; }
public string MessageID { get; set; }
}
public class LaboratoryReportAccomplishRt
{
public string LISAppNum { get; set; }
public string OrderItemID { get; set; }
public string ReportLink { get; set; }
public string UpdateUserCode { get; set; }
public string UpdateDate { get; set; }
public string UpdateTime { get; set; }
}
public class Body
{
public LaboratoryReportAccomplishRt LaboratoryReportAccomplishRt { get; set; }
}
public class Request
{
public Header Header { get; set; }
public Body Body { get; set; }
}
public class LaboratoryReportAccomplish_Req
{
public Request Request { get; set; }
}
}

比如上面两段C#代码,Header,Request,Body这些元素都有,但是比如Body里面属性又不一样,想请教下各位大神,这两段C#该如何优化为好呢,谢谢!
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Forty2 2017-04-19
  • 打赏
  • 举报
回复
引用 5 楼 hanjun0612 的回复:
...
其实在系列化中用'多态'不是很好。 原因是反系列化不容易实现: 1、把实际类型写入系列化结果是一种方案,但缺点是把具体实现泄露到交换数据中。 2、反系列化的时候,利用上下文来确定具体的子类。也是一种方案,但缺点是需要多步骤反系列化。
正怒月神 2017-04-19
  • 打赏
  • 举报
回复
这个意思?
static void Main(string[] args)
        {
            User u = new User();
            u.body = new Body1() { a = "1", b = "1", LISAppNum = 100, OrderItemID = "2" };
            string result = u.ToJsonString();
            Console.WriteLine(result);

            User u1 = new User();
            u1.body = new Body2() { c = 100, d = "12", LISAppNum = 120, OrderItemID = "3" };
            result = u1.ToJsonString();
            Console.WriteLine(result);
            
            Console.ReadLine();
        }
public class User
    {
        public virtual int id { get; set; }
        public virtual string name { get; set; }
        public virtual int parentId { get; set; }
        public virtual bool isParentId { get; set; }

        public virtual Body body { get; set; }
    }

    public class Body
    {
        public int LISAppNum { get; set; }
        public string OrderItemID { get; set; }
    }

    public class Body1:Body
    {
        public string a { get; set; }
        public string b { get; set; }
    }
    public class Body2 : Body
    {
        public int c { get; set; }
        public string d { get; set; }
    }
  • 打赏
  • 举报
回复
Body部分应用泛型,Request和Response就是一个基础类,不存在继承关系,只有Body部分才是实际业务数据
wang_peng_yl 2017-04-19
  • 打赏
  • 举报
回复
body部分继承不了, 最起码C#里不行,只能按你现在方式,重新定义新类, 如果非得想玩继承,那看如下吧:
[DataContract(Name = "Request")]
    public class RequestInfo
    {
        [DataMember]
        public Request Request { get; set; }
    }

    [DataContract]
    public class Header
    {
        private string sourceSystem = "";
        [DataMember]
        public string SourceSystem
        {
            get { return sourceSystem; }
            set { sourceSystem = value; }
        }

        private string messageID = "";
        [DataMember]
        public string MessageID
        {
            get { return messageID; }
            set { messageID = value; }
        }


    }
 
    [KnownType(typeof(SpecimenReceiveRtBody))]
    [DataContract]
    public class Body
    {

    }
 
    [DataContract]
    public class Request  
    {
        [DataMember]
        public Header Header { get; set; }    
 
        [DataMember]
        public Body Body { get; set; }    
    }
 
    [DataContract]
    public class SpecimenReceiveRtBody : Body
    {
        private SpecimenReceiveRt _BaseBody;
        [DataMember(Name = "SpecimenReceiveRt")]
        public SpecimenReceiveRt Body
        {
            get
            {
                return _BaseBody;
            }
            set
            {
                _BaseBody = value;
            }
        }
    }

    public class SpecimenReceiveRt
    {
        public string LISAppNum { get; set; }
        public string OrderItemID { get; set; }
        public string ExecUserCode { get; set; }
        public string SpeciReceiveDate { get; set; }
        public string SpeciReceiveTime { get; set; }
    }
也只是个折中的办法
  • 打赏
  • 举报
回复
虽然程序代码的设计离不开数据结构,包括继承、抽象也是,但是毕竟静态数据结构只是最初始的,只占20%不到的比重,对于稍微复杂一些的实用程序则更低。你要把精力放到 know-how 上,不要整天只知道增删改查,要保重点放在流程、活动、状态变化、消息时序、计算等方面。 如果只贴静态模型的东西,这就意味着你将来需要不断重构,需要多实际去解决一些动态模型的问题。这个刚开始的时候,最好不要为了抽象而抽象。这就好像一个只会将数据抄到关系数据库的数据表的人,他最觉得“方便的”当然就是毫无分类、分层的信息了,分层反而是多余的(因为他只是抄最终展开了的具体数据)!如果他在简单地抄数据时还追求分层抽象,那一定是为了时髦的缘故,并不是真的实用。
  • 打赏
  • 举报
回复
只有 Header 部分可继承,Body 部分根本不可能在父类中(接口中)定义。至于说程序流程、哪些部分是属于针对父类(接口)的操作,你并没有任何关于流程的分析,因此看不出来。你这里只有一个静态的数据结构,只关心一点数据结构而不关心真正的动态流程,所以无法真正了解实际的程序设计中流程问题。 只表述静态概念,只知道 know-what 而不知道 know-how,是不可能描述设计的。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧