在实现类继承时遇到的一个问题,大家来看看

cjwcommonuse 2014-07-29 12:18:21
有一个Person类,还有个Worker类,后者是前者的子类
        public class Person
{
static private long count = 0;

private string id; //11身份证号码
private string name;

public Person()
: this("")
{
}

public Person(string name)
{
++Person.count;

this.id = string.Format("{0:00000000000}", Person.count);//11为身份证号码
this.name = name;
}
}

public class Worker: Person
{
static private long count = 0;

private string workerId; //四位工号
private double salary; //薪水

public Worker()
: this("", 0.0)
{
}

public Worker(string name, double salary)
: base(name)
{
++Worker.count;

this.workerId = string.Format("{0:0000}", Worker.count);
this.salary = salary;
}
}

我的问题是这样的: 有个人,有一天找到了一个工作,变成了一个工人,这个过程怎么通过更改和扩充上面的代码实现
...全文
1009 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
缪军 2014-08-22
  • 打赏
  • 举报
回复
再次回顾这个帖子的时候,我发现我在之前的回复太具体了, 只是着眼于楼主的例子本身阐述了person对象的设计方案, 而没有抽象的解决楼主提出的问题,那就是: 任何看上去像是"动态对象"(对象的属性和操作会动态变化)的场合, 都可以用"整体-部分"结构的方案自然而然的解决 前面提到了,把职业当作人的属性, 进一步的,职业可以是一个对象,拥有自己的属性和操作, 再进一步,职业可以派生出:营业员,工人,会计师等特殊类型,它们都可以拥有自己的属性和操作, 但是都和person都是从属(聚合)关系,而不是继承关系
mlqxj35674 2014-08-12
  • 打赏
  • 举报
回复
如此抽象有问题,按其表述“不是所有人生下来就是工人啊,有的人当农民去了,有的人经商去了,部分人变成了工人”,wroker纯粹多余,因为只要person里添加一个属性Job,当其为“工人”,则person就成了工人,当其为“农民”,其就为农民,当其为空,就是无业者。这所以派生出worker,可能还有其它原因。娄主没表述清楚
於黾 2014-08-12
  • 打赏
  • 举报
回复
一个动物,不可能既是人,又是猴子. 所以人继承自动物是没有问题的. 但是如果可以兼职,那么职业继承自人就很有问题
游离失所 2014-08-12
  • 打赏
  • 举报
回复
典型的乱搞模式。。 人作为基类没问题。。worker继承人也没问题。。 你说所形容的“人-worker”中的人应该是没工作的人。。而这个没工作的人也是继承人这个基本类。。 而没工作的人这个类里面有个方法,就找找到工作,我想它应该是这样的 public workder findajob(没工作的人) 这样比较合理
於黾 2014-08-12
  • 打赏
  • 举报
回复
我白天当工人,晚上当服务员行不行? 我即当工人,又当特工,行不行?
於黾 2014-08-12
  • 打赏
  • 举报
回复
为什么老想干掉自己?? 人变工人只不过找到了工作,又不是投胎 既然是从表象上模拟现实世界,你的逻辑就应该跟客观现实一致
cjwcommonuse 2014-08-12
  • 打赏
  • 举报
回复
我只是一个菜鸟级的程序员,我现阶段编写程序只是单纯的从表象上模拟现实世界
cjwcommonuse 2014-08-12
  • 打赏
  • 举报
回复
引用 23 楼 sj178220709 的回复:
你的意思是"人成为工人之后,就不是人了"?
我的工人继承自人类,变成工人怎么就不是人了?!
cjwcommonuse 2014-08-12
  • 打赏
  • 举报
回复
引用 15 楼 sp1234 的回复:
“干掉自己”这个东西在你的问题中反复出现,但是你从来都给不出具体的操作流程,你只能写个“注释”弄弄自己(以及旁人),然后就来跟你自己的这个词儿非要反复纠结“是非”问题。 编程设计,它不是纠缠在“是非”,只是讲是否“适用”,何时“适用”。 你是否参与过“需要频繁改变对象类型”的大型系统设计?这种东西是否是一般人所需要花精力去纠结的?为什么不可以为前端的工厂查询方法查询出一个Worker类型的Person(而非要纠结什么前端“干掉自己”)?为什么不可以通知前端去某个对象需要刷新(重新查询)了? 说白了,你纠结在个别词儿上,根本不顾编程的目的是什么。编程不是什么高尚的事情,编程要符合软件工程需要并且有效,而不是把编程当作一个人“死活”的判断标准。
我问题的核心就是 怎么干掉自己,为什么采用的是注释,采用省略,就是因为不知道如何手动去释放这个对象,析构函数不能手动执行,我想,那就Dispose吧,然后我去看怎么实现Dispose,然后后面我就放弃了,不用这个思路去实现,换个思路走了
  • 打赏
  • 举报
回复
任何逻辑程序要想运行得晚辈,都总是有一小部分机制 --> 任何逻辑程序要想运行得完备,都总是有一小部分机制
  • 打赏
  • 举报
回复
如果你把这个翻来覆去纠结的“干掉自己”这个词儿用实实在在的动态流程表达出来,你才能够“落地”。否则就算是博士毕业水平,可能也是就在那里“高大上”地纠结名词儿的是非问题,而别人总是不理解你具体是说的如何“干掉自己”的含义。 没有什么真理是永远不变的,任何逻辑早晚有一点都要被修正。问题是你挑出来的是一个“技术问题”还是一个逻辑问题呢?技术问题是低级的,任何逻辑程序要想运行得晚辈,都总是有一小部分机制只能靠低级的技术问题去解释的。问题是你恰好挑出来的那个东西,最好能够证明你对其它的大量的逻辑设计和应用部分也理解,而不是故意只突出那一点点。
smthgdin_020 2014-07-30
  • 打赏
  • 举报
回复
引用 6 楼 cjwcommonuse 的回复:
[quote=引用 2 楼 bdmh 的回复:] 你new一个worker,然后让原来那个人指向这个新的worker不行吗 没有理解干掉自己是啥意思
你是说 Person p = new Worker(); 问题是每个人生下来就登记注册了身份证号码了(他是一个公民Person p = new Person()),但是不是所有人生下来就是工人啊,有的人当农民去了,有的人经商去了,部分人变成了工人,我现在希望的就是(p = p.FindJob(salary:3000.0);或者p = Person.ForceWork(p, salary:3000.0);)这期间,相当于提取出了他原来的公民信息来实例化一个Worker对象返回给原来的引用,同时原来的对象被释放;干掉就是释放的意思[/quote] 工人就new个worker,农民就new个farmer,以此类推。。。。。。。 但是这些都集成person。当然,你的基类写得有些问题。
  • 打赏
  • 举报
回复
“干掉自己”这个东西在你的问题中反复出现,但是你从来都给不出具体的操作流程,你只能写个“注释”弄弄自己(以及旁人),然后就来跟你自己的这个词儿非要反复纠结“是非”问题。 编程设计,它不是纠缠在“是非”,只是讲是否“适用”,何时“适用”。 你是否参与过“需要频繁改变对象类型”的大型系统设计?这种东西是否是一般人所需要花精力去纠结的?为什么不可以为前端的工厂查询方法查询出一个Worker类型的Person(而非要纠结什么前端“干掉自己”)?为什么不可以通知前端去某个对象需要刷新(重新查询)了? 说白了,你纠结在个别词儿上,根本不顾编程的目的是什么。编程不是什么高尚的事情,编程要符合软件工程需要并且有效,而不是把编程当作一个人“死活”的判断标准。
threenewbee 2014-07-30
  • 打赏
  • 举报
回复
你的问题分为两个层次讨论。 首先,面向对象不是用来简单模拟现实世界中的实体,以及它们的从属关系。而仅仅是一种编程范式。所以“一个人找到工作,于是变成一个工人”用一个对象表示“人”,以及模拟它变成“工人”,这种设计是错误的。 然后,在程序运行的过程中,得到派生类型,这种编程范式是否存在?答案是存在,并且广泛应用于那些动态的编程语言(ruby js io等等语言),这种范式被叫做原型(prototype)。不同语言编程范式的差异也说明,面向对象和现实的模拟没有任何关系。它仅仅是针对特定编程语言和特定领域需求实现特定代码的一种手法。
  • 打赏
  • 举报
回复
多用组合,少用继承 为什么不考虑将 工人作为人的一个职业而存在呢????而这个职业是人的一个属性,人不可能发生变化,但人的职业是可变的
  • 打赏
  • 举报
回复
你的意思是"人成为工人之后,就不是人了"?
wanghui0380 2014-07-30
  • 打赏
  • 举报
回复
引用 9 楼 cjwcommonuse 的回复:
什么叫内涵?
什么叫内涵,内涵表明本质,也就是“is” 是的关系。 我们经常看到滴什么动物,鸟的那种继承,你会发现这话是这么说滴“小鸟是动物,动物的其中一种是小鸟” 那么你的例子呢“职业是人,人的一种是职业”这话说滴通么??
kkg_1473995421 2014-07-30
  • 打赏
  • 举报
回复
继承泛型类输出信息的实例 class BStuInfo<T> { public T ID; //声明学生编号字段 public T Name; //声明姓名字段 public T Sex; //声明性别字段 public T Age; //声明年龄字段 public T Birthday; //声明生日字段 public T Grade; //声明班级字段 } class HStuInfo<T> : BStuInfo<T>//继承自BStuInfo泛型类 { public T Chinese; //声明语文成绩字段 public T Math; //声明数学成绩字段 public T English; //声明英语成绩字段 }//CodeGo.net/ private void button1_Click(object sender, EventArgs e) { HStuInfo<object> Exte = new HStuInfo<object>();//实例化派生类对象 //通过派生类对象引用学生信息相关的字段,并为其赋值 Exte.ID = 1; Exte.Name = "张三"; Exte.Sex = "男"; Exte.Age = 16; Exte.Birthday = Convert.ToDateTime("1993-11-29"); Exte.Grade = "三年五班"; Exte.Chinese = 145; Exte.Math = 140; Exte.English = 137; //将学生信息显示在TextBox文本框中 textBox1.Text = Exte.ID.ToString(); textBox2.Text = Exte.Name.ToString(); textBox3.Text = Exte.Sex.ToString(); textBox4.Text = Exte.Age.ToString(); textBox5.Text = Exte.Birthday.ToString(); textBox6.Text = Exte.Grade.ToString(); textBox7.Text = Exte.Chinese.ToString(); textBox8.Text = Exte.Math.ToString(); textBox9.Text = Exte.English.ToString(); }
qwertxp 2014-07-30
  • 打赏
  • 举报
回复
类的设计和具体的业务需求有关,可以按国家来抽象类,中国人,美国人……可以按职业来抽象,工人,农夫,教师……甚至直接按性别,男人,女人。这是没问题的。 从楼主的业务需求描述来看,是人找到了某个职业,所以worker类从person类继承没有正确的描述需求。所以职业类应该是person类的一个属性,应该在person类中新增job属性,说明此人的当前工作。如楼主自己所说,一个人从出生就有自己的身份,不可能因为找到工作,更换工作,失业就干掉自己以前的身份吧。 因此,正确做法是修改设计。
ZA0810 2014-07-30
  • 打赏
  • 举报
回复
应该直接把 Work 这个class 变成Person 的属性. 或者你在Worker 和Person 类里面在写一个 构造方法 加一个参数 ID 这样 你就可以无视之前那个PERSON 垃圾回收会自己回收.
加载更多回复(13)

110,533

社区成员

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

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

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