有个疑问
1。有个grade成绩属性,有个student类和section类,现在要取得一个学生的成绩,那grade 是放在studen类中还是放在section类中?2.在比如,有个opendoor()的方法,现在有个事件,人开门,那时 是放在person类中还是放在door类中?然后又想了下,类库中操作数据库的connection类里面的close(关闭连接的方法),它是放在连接类中的,那是不是如上opendoor(开门)也可以放在door类中? 但是有常听人说开门应该放在person类中?因为开门由人来开的想听听大家的意见,一般怎么设计面向对象的类,属性,方法的?或者怎么区分?请具体点说明下

解决方案 »

  1.   

    这个看你的理解和具体使用的情况啦,假如你的操作以人为主那么就可以把开门的方法放到person类中,反之则放到door中。并且在对等情况下可以以注入的方式组织,比如door中有open方法,则这个open方法可以有一个参数为person,这样就可以把door和person耦合了。
      

  2.   

    第一个不回答.来回答第二个.2.在比如,有个opendoor()的方法,现在有个事件,人开门,那时 是放在person类中还是放在door类中? 然后又想了下,类库中操作数据库的connection类里面的close(关闭连接的方法),它是放在连接类中的,那是不是如上opendoor(开门)也可以放在door类中? 但是有常听人说开门应该放在person类中?因为开门由人来开的.
    真正的面向对象思想的话,两个都要写.
        public class Door
        {
            private string _operators;
            /// <summary>
            /// 记录开门者
            /// </summary>
            public string Operators
            {
                get { return _operators; }
                set { _operators = value; }
            }
            public void OpenDoor()
            {
            }
            /// <summary>
            /// 某人打开门
            /// </summary>
            /// <param name="p">人</param>
            public void OpenDoor(Person p)
            {
                _operators = p.Name;
                OpenDoor();
            }
        }    public class Person
        {
            private string _name;        /// <summary>
            /// 姓名
            /// </summary>
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            /// <summary>
            /// 开门
            /// </summary>
            /// <param name="door">要打开的门</param>
            public void OpenDoor(Door door)
            {
                door.OpenDoor(this);
            }
        }Door的第一个无参重载的OpenDoor()方法,主要用于初始化..例如Door为Room的一个成员,希望初始化Room的时候门就是打开的,而初始化Room时不需要Person.就可以使用OpenDoor()来初始化.
    第二个OpenDoor(person p)有参的,是向外提供的操作方法.
    ----------------
    总的来说,是互操作性的体现.
      

  3.   

    如果单对Person来说.最好不要定义OpenDoor()这样的方法..除非将Person改为GateKeeper类.
    因为对Person类来说,它更像一个基类,抽象的.基类上不要定义任何具有针对性的方法.因为Person类更广泛,OpenDoor()方法对使用者来说会引起疑惑.
      

  4.   

    面向对象和基于对象的最大区别就是...如何看待对象...第1个问题...grade和student及section是什么关系?注意我没有说类,不要从技术或编程角度去考虑...现实世界是grade是给section的打分而不是给student的打分...认为grade是给student的打分是“人”产生的主观意识,老师评卷时是不管这试卷是谁做的...第2个问题...person和door是什么关系?现实世界是the door has been opened表明door发生了事件而不是person发生了事件...认为opened是person open the door导致的也只是“人”产生的主观意识,阿猫阿狗也可以开门...面向对象不是考虑哪个属性(方法、事件)在哪个类中,而是思考哪个对象的信息、行为将对自身及相关对象产生的联系和影响...所以1、2楼都是基于对象的思维,不是面向对象...
      

  5.   

    真有点犯晕了。。如果按照鸟会飞的想法来理解人开门,那就不必说了···但人不一定要去开门啊,就跟鸵鸟不会飞似的,一般开门是门卫的事l了···也就是根据具体情况该怎么定,如果是门卫,可以在Person里放OpenDoor,但若人开门不是必须全部,可通过#1楼的大哥方法来,应是不错的
      

  6.   

    第一个问题照不做回答.
    第二个:
    现实世界是the door has been opened表明door发生了事件而不是person发生了事件...这个我认同,但就方法而言,保留意见.
    在设计模式中,一个对象可以用自身构造函数构造.也可以被工厂模式中的构造方法构造.
    现在我有一个需求,一扇门我希望它在打开和关闭的时候都记录是谁打开的.
    于是有两种设计模式.
    1. Door.OpenDoor(Person p)
    2.Person.OpenDoor(Door d)
    两者效果一样,只不过是观察模式不同而已.但个人比较推崇2,因为Door是不会主动打开的,只会被打开.
    所以Person.OpenDoor(Door d)方式更直观.2楼已经讲述过为什么Door要保留OpenDoor(),是为初始化而为之.
      

  7.   

    如果谈到鸟猫狗之类的开门,那应该不是这里讨论的问题范畴了.已经上升到了"面向接口"的范畴.
    定义一个
           
    public interface IOperationDoor
            {
                void OpenDoor();
            }的接口未尝不可.
      

  8.   

    不要沉醉在什么模式、接口上...那些只是OOP解决具体问题的方法,OOAD还不考虑P时不要先入为主给自己套上一个枷锁...只说个最常见的例子,.NET的事件委托EventHandler,自己去体会...delegate void EventHandler(object sender,EventArgs e)看明白这两个参数就会明白open door和door opened与person没有任何直接联系...你想让他们联系是你的主观意愿,不是客观存在...