您的位置:首页 > 编程语言

面向对象思想编程

2013-05-18 11:03 393 查看
1.一切都是对象;
2.属性,行为,关系 关系只有四种(1关联;2继承,泛化。3依赖;4实现;)
3.符合需求(现实)(这一点很重要;写代码时候一个要考虑是否符合现实);

例题:学院教师信息管理系统

1,查询每个学院有多少教师
2.浏览每个教师信息;
3.按姓名查找某个教师;

有这么三个要求;我们要分析一个需求,OOA过程
我们要从里面找出可以作为类 或者属性的词;
一般我们用名词动词法;就是从需求里面找出名词和动词,一般名词可以作为类或者属性。动词可以作为行为;
在上面需求中我们找到这么几个名词:学院,教师,姓名,信息(注意这是一个泛性词,具有泛性,写文档时候这里要写出具体的信息,如,姓名,性别,等等;)
那我们来判断一下名词中哪些可以为属性哪些为类

属性原则:
1原子性
2从属性
属性原则可以判断出 姓名 为属性,因为它有上面两中特性;
学院和教师为类;

想想学院和教师是什么关系?关系只有四种(1关联;2继承,泛化。3依赖;4实现;)

关联关系:属于,拥有;例如像学院和教师就是关联关系
继承关系:包含,层次;
依赖关系:相互影响的关系

判断关联和继承关系;

判断继承;Animal 和dog
Animal is a dog 错误
dog is a Animal 正确 像这样一个成立一个不成立 就是继承关系;

再如 学院 和 教师
学院是一个教师 错误
教师是一个学院 错误 所以他们不是继承关系

关联 :导航性
多重性
角色性

所以他们是关联关系 学院 和 教师 一对多 OOA

现在下面就是实现代码的过程了 OOD;

class School
{
private string _name;

//构造函数

public School(string name)

{

_name=name;

_teachers =new List<Teacher>();

}

//因为一个学院有很多教师,我们把教师放在;一个List集合中;

private List<Teacher> _teachers;

//实现问题1,查询学院教师个数

public int GetTeacherConnt()

{

return _teachers.Count;

}

//接受一个教师;

public void AcceptTeacher(Teacher teacher)

{

_teachers.Add(teacher);

}

------方法一;错误示范代码---------------------------------------------------------------
//浏览教师信息 明显是一个集合

public List<Teacher> Teachers

{

get{ return _teacher;}

}

}
-------------------------------------------------------------------------

-------方法二:错误示范代码--------------------------------------------------------------
public IEnumable<Teacher> Teachers

{

get{ return _teacher;}

}

---------------------------------------------------------------------

------方法三:正确做法-----------------------------------------------
public IEnumerable<Teacher> Teacher

{

get
{
foreach(Teacher t in _teacher)

{

yiled return t;
}

}

}

------------------------------------------------------------------------
----正确方法四:------------------------------------------------------
//只读
public System.Collections.ObjectModel.ReadOnlyCollection<Teacher> Teachers
{
get
{
return _teachers.AsReadOnly();
}
}
-------------------------------------------------------------------------
//教师类
class Teacher
{
//一个教师从属于一个学院,所以这里不是集合,是一个;学院不能随便更改,private

private School _school;

privarte string _name;

public sring Name

{

get{return _name;}

set{ _name=value}

}

//构造函数

public Teacher(string name , School school)

{

_name=name;

_school=school;

_school.AcceptTeacher(this); //在构造教师的时候就要将教师加到所在学院的teachers集合中;
}

}
//主函数;
static void main ()
{
School soft=new School("软件学院");

School base=new School("基础学院");

Teacher teach1=new Teacher("石臻臻",soft);

//执行查询就可以;

soft.GetTeacherCount();

//浏览教师的信息

(这里应该怎么写代码?我们可以在School中给_teachers写一个属性)

若如方法一那样写代码,就会有问题,不符合现实需求,因为我们把私有的_teachers公有了,可以随便添加教师了

base.Teachers.Add("石臻臻");

这样一行代码之后,试问石臻臻这个教师到底是哪一个学院的?这不不知道的不明确的;所以这样写代码不行;不能让它有Add方法;因为List是派生于Ienumable的;Ienumable没有Add方法;所以看方法二;

但是,用方法二就可以了吗?虽然Ienumable没有Add方法了,但是我可以将它强制转换成List<>类型;然后调用Add()方法;所以 这是没用的;

正确做法是方法三;迭代每个教师返回;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: