首页 新闻 会员 周边

面向对象继承问题

0
悬赏园豆:20 [已解决问题] 解决于 2013-09-05 09:47
 1 public class Father
 2 {
 3     public string LastName { get; set; }
 4 }
 5 
 6 public class Son : Father
 7 {
 8     public string FirstName { get; set; }
 9 }

有这样两个简单的Class,问题是这样:

假设我现在已经有了一个Father的实例,有没有方法获得一个Son的实例,不通过逐个属性赋值,将Father的数据继承下来?

zucker1988的主页 zucker1988 | 小虾三级 | 园豆:586
提问于:2013-09-04 16:05
< >
分享
最佳答案
1

不能。

 

虽然我说了不能,但是我还是给出一种曾经的解决方案,此方案很巧妙,但是劝你别这样用,不过它确实做到了不是“一个字段一个字段的赋值”,而是对“所有字段值的整体拷贝”。

http://q.cnblogs.com/q/10275/

收获园豆:5
Launcher | 高人七级 |园豆:45045 | 2013-09-04 16:11

序列化的思路不错~

zucker1988 | 园豆:586 (小虾三级) | 2013-09-05 09:53
其他回答(5)
0

这个需求挺奇怪的,为什么要这样设计呢。如果不逐个属性复制,可以通过反射来实现,遍历Father类实例里面public和protect的属性,获取其值,实例化一个Son类的实例。

收获园豆:5
会长 | 园豆:12401 (专家六级) | 2013-09-04 16:11

我想给一个类拓展一个属性,但现在只能拿到父类的实例

支持(0) 反对(0) zucker1988 | 园豆:586 (小虾三级) | 2013-09-04 16:15
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace GetSon
{
    class Program
    {
        static void Main(string[] args)
        {
            Father father = new Father();
            father.Name = "Joey";

            Son son = new Son();
            son.Fill(father);

            Console.WriteLine(son.Name);
            Console.ReadKey();
        }
    }

    class Father
    {
        public String Name { get; set; }
    }

    class Son : Father
    {
        public int Age { get; set; }
    }

    static class Helper
    {
        public static void Fill(this Father father, Father sourceFather)
        {
            Type t = typeof(Father);
            PropertyInfo[] props = t.GetProperties();
            foreach (var item in props)
            {
                item.SetValue(father, item.GetValue(sourceFather));
            }
        }
    }
}
支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2013-09-04 16:23

@l3oz: 给一个类拓展一个属性 是什么意思?你想修改代码,加一个新属性?你的意思是说:你想给父类加一个新属性,子类不需要修改代码就可以从父类里得到这个属性的值?你看看我写的代码可以不,不过有点问题,我写的代码只对public的属性起作用。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2013-09-04 16:29

@会长: 明白你的意思~我也这样搞过,想看看有什么更好的思路或者设计

支持(0) 反对(0) zucker1988 | 园豆:586 (小虾三级) | 2013-09-04 16:37
0
    class Program
    {

        public static void Main(string[] args)
        {
            Father f = new Father();
            f.LastName = "aaa";
            Son s = new Son(f);
           
            Console.WriteLine(s.LastName);
            Console.Read();
        }

    }


    public class Father
    {
        public string LastName { get; set; }

        public Father() 
        {
        
        }

        public Father(Father f)
        {
            this.LastName = f.LastName;
        }
    }

    public class Son : Father
    {
        public Son() 
        {
        
        }

        public Son(Father f) : base(f)
        {
             
        }

        public string FirstName { get; set; }
    }

刚才动了下脑筋,这样写不知道可以吗?虽说是有一个赋值的语句,但是无论多少个具体的父类实例都可以用这一个代码啊,只需实例化就行了。

收获园豆:5
clcvc | 园豆:62 (初学一级) | 2013-09-04 16:21

这还是逐个属性赋值

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2013-09-04 16:26
0

这样是不可以的

妍珊 | 园豆:1169 (小虾三级) | 2013-09-04 16:36
0

只能逐个属性赋值,可以借助AutoMapper帮你自动完成

收获园豆:5
dudu | 园豆:30979 (高人七级) | 2013-09-04 16:57
0

需求虽然有点怪,但是实现是完全可以的

son是从father派生来的,所以可以通过映射的方式来给son部分属性进行赋值(从father中继承来的)

至于son其他的属性那么只能通过反射来实现了

andy1987 | 园豆:490 (菜鸟二级) | 2013-09-04 17:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册