面向对象设计中的专门化和泛化
本文关键字:泛化 专门化 面向对象设计 | 更新日期: 2023-09-27 17:50:30
我们正在为学生和老师建立一个社交网站。目前我们正在做账户和权限相关的东西
我们是应该为Student和teachers创建两个独立的类,还是创建一个名为Account的类,并拥有一个Account类型属性,该属性可以是enum {Student, teacher, admin}
你可以创建一个Person类,并为Student和Teacher和model Account创建子类,作为一个单独的类,可以有以下任何一个:1)一个只表示它属于谁(哪个Person对象)的属性2)一个表示它属于老师还是学生的属性3)一个持有表示帐户拥有特权的bitset的属性(假设个人拥有的特权是帐户之间唯一的区别因素)。你想怎么做取决于你想要支持的特性。这里提到的每种方法都有自己的优点和缺点。
100%遵循OO设计:学生不是老师。两人都是人。
但这一切都取决于他们应该能做什么。如果没有区别,就坚持使用Account
类和type
属性来说明他们是哪种用户。
如果你想遵循。net安全模型,你应该添加Student和Teacher作为角色,并使用Thread.CurrentPrincipal.IsInRole("teacher")
来检查他们的权限。
方案一
使用标记enum
[Flags]
public enum AccountType
{
Guest,
User,
Teacher = 2,
Admin = 4
}
public class Account
{
public bool IsTeacher
{
get { return (user.AccountType & AccountType.Teacher) != 0; }
}
public int AccounType {get;set;}
}
var teacherAndAdmin = AccountType.Teacher + AccountType.Admin;
解决方案2
使用角色数组(和一个单独的表)。将所有角色加载到帐户中:
public class Account
{
private List<string> _roles = new List<string>();
public void IsTeacher
{
get { return _roles.Contains(AccountRoles.Teacher); }
}
}
public static class AccountRoles
{
public const string Teacher = "Teacher";
}