面向对象设计中的专门化和泛化

本文关键字:泛化 专门化 面向对象设计 | 更新日期: 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安全模型,你应该添加StudentTeacher作为角色,并使用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";
}