面向对象设计的专业化和泛化

时间:2011-04-18 07:32:55

标签: c# oop

我们正在为学生和教师建立一个社交网站。 目前我们正在开发与帐户和权限相关的东西

我们是否应该为学生和教师创建两个单独的课程,或者为一个名为Account的单个课程创建一个帐户类型属性,该属性可以是枚举{student,teacher,admin}

2 个答案:

答案 0 :(得分:1)

遵循OO设计100%:学生不是老师。两人都是人。

但这一切都取决于他们应该做些什么。如果没有区别,只需坚持使用Account类和type属性来说明他们是什么类型的用户。

如果您想要遵循.NET安全模型,您应该将学生教师添加为角色,并使用Thread.CurrentPrincipal.IsInRole("teacher")检查他们的权限。

更新

解决方案一

使用标记枚举。

[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";
}

答案 1 :(得分:1)

你可以创建一个Person类,并为Student和Teacher创建子类,并将模型Account作为一个单独的类,它可以有以下任何一个:1)一个属性,它只能说明它属于谁(哪个Person对象)2)一个属性,表明它是属于教师还是学生; 3)属性,其中包含一个表示该帐户具有的特权的位集(假设个人拥有的特权是帐户之间唯一的区分因素)。您希望如何实现它将取决于您希望支持的功能类型。这里提到的每种方法都有自己的优点和缺点。