写个代码。public class User { //发帖 protected bool PostTopic() { } }public class Banzhu:User { //删帖 protected bool DeleteTopic() { } }public class Admin:User { //删除用户 protected bool DeleteUser() { } } 这个使用工厂模式的话,就是实例化User,User调用不了Banzhu和Admin里的方法。
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("...");
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){} }
问题来了,Admin和Banzhu类里有自己的方法,这些方法在User中是没有的。 User user=UserFactory.CreateUser("..."); user能调用Admin和Banzhu里的方法吗?貌似不可以的吧!
{
//发帖
protected bool PostTopic()
{
}
}public class Banzhu:User
{
//删帖
protected bool DeleteTopic()
{
}
}public class Admin:User
{
//删除用户
protected bool DeleteUser()
{
}
}
这个使用工厂模式的话,就是实例化User,User调用不了Banzhu和Admin里的方法。
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("...");
满足里氏代换是工厂模式的基本要求。楼主应该把功能抽象到几个接口,然后具体的User实现一个或者多个接口。
我觉得你的程序设计思路总是跟“自然”是相反的!为什么要抽象?因为我们设计User的时候根本不去考虑子类。那么你为什么要在User中去调用子类?具体是干什么呢?我不得而知。就算你再怎么想省事,也要注意类型之间的关系。在User内如果你想设计一个可以被具体化替代的“先知先觉”的方法,你可以设计一个空的(什么也不做)的方法,标记上Virtual,然后在User的控制流程中调用这个方法。而各个子类会去各自按照自己的情况实现(Override)这个方法。
{
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){}
}
User user=UserFactory.CreateUser("...");
user能调用Admin和Banzhu里的方法吗?貌似不可以的吧!
你每次都会震撼我的心灵。
按照你的意思,是在User类里写上所有的函数(虚函数),然后在子类里如果需要这个函数再重写它。是这个意思吗?
按照我这张图的结构关系,这样是不是符合你所说的“面向对象”,而不是“基于对象”。或者说,按照我这张图,最好的“面向对象”设计应该是怎么样的?
比如我选择数据库抽象的类里面有个“启动”这个方法,然后具体工厂比如sql 和oracle分别有自己的“启动”方法。这时候用工厂模式挺好。我觉得你这个用抽象类里面可以把所有大家必须实现的方法用abstract去封装,非必须的则用virtual去封装是比较好的