本帖最后由 fihuang 于 2009-09-17 11:02:03 编辑

解决方案 »

  1.   

    “用接口”之前你用过继承吗?从定义上说,接口和class继承都是继承扩展的一种方式而已。滥用接口或者class继承是非常有害的。根据你的图,如果你定义管理员具有普通用户接口就是在滥用接口。一个管理员他本人就是普通用户吗?不是。所以如果此时你的“我想用接口”是错误的。
      

  2.   


    你先有了“普通用户”,然后额外考虑到了“群主、版主、管理员”。那么你想表达每一个群主也是一个普通用户吗、同时每一个管理员也是一个普通用户吗?如果是,那么你起的这个“普通用户”名字就要误导性。而如果不是,仅仅因为后三者的行为特种有一部分与普通用户类似,那么你就要为这四者抽象出一个接口来,然后不论是普通用户还是后边三个,都是用这个抽象接口。只不过普通用户对这个抽象的扩展最少(甚至没有扩展),而后边三者各自有各自的扩展。这才是抽象的正常做法。而不是用代码表述为后三者都具有普通用接口。接口(或者class继承),具有重要的设计意义,要从领域分析角度去使用(使得需求分析和最终的代码实现完全一致),不要为了编程方便而滥用。
      

  3.   

    想起来了 继承是【is a】的关系 改了一下 见下图此时心中豁然开朗,但是:
    【你有没想过一个用户既可以是群主,又可以是版主,还可以是管理员呢? 
    用户就是用户,用户之间的区别只是他们具有的权限不同。】一想还真有这个问题!这个问题怎么解决?
      

  4.   

    你这么一说,我突然觉得怎么越来越难了。其实这个类只是用于在UI层调用的,只提供方法给UI层,所以我想分细一点儿,而不必包含属性,这也是我为什么一直想用接口的原因!
      

  5.   

    come on如果这些登录用户(普通用户、群主、版主、管理员)只用一个类的话,就必须再给这个类添加角色和权限属性。
    最关键的问题是,举个例子:当我实例化一个普通用户之后,版主和管理员的方法对普通用户也是可见的。这就是我想细分成n个类的原因,我的想法是:一个类型的用户只能看见这个类型用户自己的方法,别的类型用户的方法对他来说是不可见。 这个思想大家觉得有问题吗?有什么方法可以解决这个问题。
      

  6.   

    这样的话,大概不用接口吧? 不知以下可否作为参考……abstract class VisitorNeedToLogin
        {
            public string GetAccount(string name)
            { 
                //
            }
            public abstract void Do();
            //
        }
        public class NormalUser : VisitorNeedToLogin
        {
            public override void Do()
            {
                Console.WriteLine("I am a normal user.");
            }
            //some methods belong to NormalUser only
        }
        public class GroupMaster : VisitorNeedToLogin
        {
            public override void Do()
            {
                Console.WriteLine("I am a group master");
            }
            //some methods belong to GroupMaster only
        }
        public class Administrator : VisitorNeedToLogin
        {
            public override void Do()
            {
                Console.WriteLine("I am an administrator");
            }
            //some methods belong to Administrator only
        }
      

  7.   

    调用时:    static void Main(string[] args)
        {
            Huron.Visitors.NormalUser normal = new Huron.Visitors.NormalUser();
            normal.GetAccount("");//所有用户都有的方法,而且实现方法也都一样。比如都通过name向数据源取得account的具体信息。
            normal.Do();//所有用户都有的方法,但也许实现不同,比如普通用户可能默认转向前台首页,而管理员可能默认转向后台首页。
            normal.IMNurmalUser();//普通用户特有的方法。
            Huron.Visitors.Administrator admin = new Huron.Visitors.Administrator();
            admin.GetAccount("");
            admin.Do();
            admin.IMAdmin();
        }
    我想是这意思吧。
      

  8.   

    设计模式中有TEMPLATE METHOD,我理解是这样
      

  9.   

    再详细举个例子。
    数据层:
    1.类User:里面全是方法,用户在网站上的所有对数据库的操作。
    2.类ModelUser:里面存储用户的属性。
    业务逻辑层:
    类TieZi(帖子):里面都是方法,所有对帖子操作的方法,比如发帖、删帖、置顶等等。
      

  10.   

    版面:id、名称、父版面,等等等
    帖子:id、标题、内容、发帖者、回复,等等等
    .....