本帖最后由 fihuang 于 2009-09-21 17:37:18 编辑

解决方案 »

  1.   

    写个代码。public class User
    {
        //发帖
        protected bool PostTopic()
        {
        }
    }public class Banzhu:User
    {
        //删帖
        protected bool DeleteTopic()
        {
        }
    }public class Admin:User
    {
        //删除用户
        protected bool DeleteUser()
        {
        }
    }
    这个使用工厂模式的话,就是实例化User,User调用不了Banzhu和Admin里的方法。
      

  2.   


        class UserFactory
        {        static User CreateUser(string type)
            {
                User user = null;
                switch (type)
                {
                    case "user":
                          user=new  User();
                        break;
                    case "banzhu":
                          user = new BanZhu();                    break;
                    case "Admin":
                        user = new Admin();                    break;
                }            return user;
            }
        }  调用时:User user=UserFactory.CreateUser("...");
      

  3.   

    不行啊,楼主这样的继承关系违反了里氏代换法则,就是子类不能有父类中没有的公开的成员。
    满足里氏代换是工厂模式的基本要求。楼主应该把功能抽象到几个接口,然后具体的User实现一个或者多个接口。
      

  4.   


    我觉得你的程序设计思路总是跟“自然”是相反的!为什么要抽象?因为我们设计User的时候根本不去考虑子类。那么你为什么要在User中去调用子类?具体是干什么呢?我不得而知。就算你再怎么想省事,也要注意类型之间的关系。在User内如果你想设计一个可以被具体化替代的“先知先觉”的方法,你可以设计一个空的(什么也不做)的方法,标记上Virtual,然后在User的控制流程中调用这个方法。而各个子类会去各自按照自己的情况实现(Override)这个方法。
      

  5.   

    在帖子http://topic.csdn.net/u/20090922/22/22190c2f-1c54-4f49-b332-f45eaca48d52.html中我简单分析了一下“面向对象设计和基于对象设计的区别”的问题。如果你从基于对象的思路,转变为面向对象的思路,可以写出更加持久、可扩展的软件。
      

  6.   

    搞清楚override的设计意义,就可以进入面向对象设计的门槛。在你的问题中,你只能接收结构上的继承,但是还想不明白子类如何override父类这个机制。
      

  7.   

    public class User
    {
     public virtual bool PostTopic(Topic topic)
     {//...
     }
    }
    public interface IDeleteable
    {
     void DeleteUser(User u);
     void DeletePost(Topic t);
    }
    public class AdminUser:User,IDeleteable
    {
     public void DeleteUser(User u){}
     public void DeletePost(Topic t){}
    }
    public class Banzhu:User:IDeleteable
    {
     void DeleteUser(User u){}
     public void DeletePost(Topic t){}
    }
      

  8.   

    问题来了,Admin和Banzhu类里有自己的方法,这些方法在User中是没有的。
    User user=UserFactory.CreateUser("...");
    user能调用Admin和Banzhu里的方法吗?貌似不可以的吧!
      

  9.   

    肯定是不可以调用的,如果你一定要这样做的话而不更改你的设计思路,那么只能强转为Admin或Banzhu类型,然后再调用;要么就修改一下设计思路,并且加入权限的控制,不要把继承和权限混为一潭;还是那句话,工厂只关心创建,不关心你外部的使用方式
      

  10.   


    你每次都会震撼我的心灵。
    按照你的意思,是在User类里写上所有的函数(虚函数),然后在子类里如果需要这个函数再重写它。是这个意思吗?
    按照我这张图的结构关系,这样是不是符合你所说的“面向对象”,而不是“基于对象”。或者说,按照我这张图,最好的“面向对象”设计应该是怎么样的?
      

  11.   

    你这玩意不需要用工厂模式,首先工厂模式一般是抽象工厂里面具体方法,然后在具体的工厂里面分别实现。
    比如我选择数据库抽象的类里面有个“启动”这个方法,然后具体工厂比如sql 和oracle分别有自己的“启动”方法。这时候用工厂模式挺好。我觉得你这个用抽象类里面可以把所有大家必须实现的方法用abstract去封装,非必须的则用virtual去封装是比较好的
      

  12.   

    看到你性感的头像中的那个家伙扛着RPG就觉得很HIGH