加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#多态性问题

发布时间:2020-12-16 00:12:21 所属栏目:百科 来源:网络整理
导读:我有一个名为:A的BL类,名为DTO的DTO类.现在假设我想在我的DTO中添加更多属性.所以我从现有的DTO中派生出一个新的DTO类,并为它添加属性.下面是代码: namespace TestConsole{ class test { static void Main(string[] args) { B b = new B(); b.D.ID = 1; b.
我有一个名为:A的BL类,名为DTO的DTO类.现在假设我想在我的DTO中添加更多属性.所以我从现有的DTO中派生出一个新的DTO类,并为它添加属性.下面是代码:

namespace TestConsole
{
    class test
    {
        static void Main(string[] args)
        {

            B b = new B();
            b.D.ID = 1;
            b.D.Name = "4";
            MyBLMethod(b);

        }
        static void MyBLMethod(A b)
        {
            MyDALMethod(b.D);
        }

        static void MyDALMethod(DTO dto)
        {
           int i = dto.ID;
           string name = ((MyDTO)dto).Name;//I could not do this 
            //because i will get object cast error as i can't cast from 
            //parent to child
        }

    }
    public class DTO
    {
        public int ID = 99;
        public DTO()
        {
        }

        public DTO(DTO source)
        {
            ID = source.ID;
        }
    }

    public class MyDTO : DTO
    {
        public string Name = "";
        public MyDTO() { }
        public MyDTO(MyDTO source)
            : base(source)
        {
            Name = source.Name;

        }
    }
    public class A
    {
        private DTO _d;
        public A()
        {
            D = new DTO();

        }

        public DTO D
        {
            get { return _d; }
            set { _d = value; }
        }
    }

    public class B : A
    {
        private MyDTO _md;
        public B()
        {
            _md = new MyDTO();

        }

        public MyDTO D
        {
            get { return _md; }
            set { _md = value; }
        }
    }

}

从Main(您可以将其视为UI)我调用MyBLMethod(存在于BL存储库中)并将类对象传递给它,并且从BL存储库调用我的DAL.在DAL我写了这个:

static void MyDALMethod(DTO dto)
{
    int i = dto.ID;
    string name = ((MyDTO)dto).Name;//I could not do this 
       //because i will get object cast error as i can't cast from 
       //parent to child
}

你能建议我怎样才能在我的DAL中获得新扩展的属性(示例中的名称).

解决方法

当B继承A时,它已经拥有DTO属性.所以问题实际上是你隐藏了这个继承.您不需要B类中的新属性,只需在类构造函数中设置它即可.

public class B : A
    {
        public B()
        {
            this.D = new MyDTO();
        }

    }

但是,在您的主要课程中,您需要在您的属性中进行显式转换,就像下面一样,因为DTO没有“Name”属性.

static void Main(string[] args)
        {
            B b = new B();
            b.D.ID = 1;
            ((MyDTO)b.D).Name = "4";
            MyBLMethod(b);
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读