【发布时间】:2017-04-09 10:13:03
【问题描述】:
我有这样一个简单的用户结构:
public Guest() : IUser
{
}
[Table("Users")]
public class Customer : Guest
{
[Key]
public string UserName { get; set; }
public string Password { get; set; }
public string Address { get; set; }
public bool IsAdmin { get;protected set; }
public UserCart UserCart { get; private set; }
public Customer()
{
}
public Customer(string username, string password, string address)
{
this.Address = address;
this.UserName = username;
this.Password = password;
this.IsAdmin = false;
this.UserCart = new UserCart();
}
}
public class Admin : Customer
{
public Admin()
{
}
public Admin(string username, string password,
string address)
: base(username, password, address)
{
IsAdmin = true;
}
}
继承是基于他们可以做的Actions。该系统必须根据使用它的人而有所不同。
管理员可以浏览、购买和处理订单和商品。
客户可以浏览和购买。
客人只能浏览(当然还有登录/注册)。
要知道谁是我们当前的用户,我们需要在Authentication class 中添加一个属性或字段,即IUser,这样任何人,管理员、客户和访客都可以在其中实例化。
问题是,当我只有这个 IUser 时,当我实例化时,我基本上什么也做不了。
所以问题是:我想加载该字段或属性,但我仍然想访问它的功能 - 但只有给定用户可以访问的功能,所以如果管理员登录,我想做管理员的工作。如果客户登录,我只希望能够列出商品等。这个怎么做?
编辑:尝试反射
public class Guest : IUser
{
public Guest()
{
}
public object Get()
{
Type type = this.GetType();
var result = Activator.CreateInstance(type);
return result;
}
}
Get() 方法只给出一个object,但如果它被Guest 调用,它必须是Guest。如果由Admin 调用,它必须是管理员。
我可以使用覆盖来做到这一点,但以后很难修改。
所以我希望这样:
(MyObject)Activator.CreateInstance(type);
如果从访客调用,MyObject 是访客,如果从管理员调用,则为管理员。我错过了什么?当然我尝试了泛型,但是当我实现接口时需要一个具体的类型,所以基本上我需要在我所有的后代类中实现它。
【问题讨论】:
-
如果你想在你的情况下使用这个方案,正如你已经指出的那样,是行不通的。您需要更改类的继承方式。你不这么认为吗?我认为
IUser需要一个公共方法Login -
感谢您与我们联系。这不仅取决于我,还有一大堆其他方法,我只是想在这里保持简单。我的想法是,我将在
IUser中定义的方法中使用reflection,比如Get(),它将返回变量的实际类型。可行吗? -
我已经在我们制作的一些游戏中使用了它。基本上,我们有
Monster类和User类,它们派生自Unit。我在基类中有一个方法GetUnitType()defiend。它也很快:) -
很高兴我们想到了同样的事情。你能告诉我你在那里是怎么做的吗?在我的课程中使用 if-elseif 等是很明显的,但我需要一些通用的东西,我现在所能做的就是使用
Activator.CreateInstance(typeOfMyObject),但我必须将它转换为我的类型。或者我应该在我的所有课程中覆盖这个Get()? -
“问题是,当我只有这个 IUser 时,当我实例化时,我基本上什么都做不了。” – 这些用户类型有什么共同点?这就是通用接口中应该包含的内容。如果它们没有任何共同点,那么它们可能根本就不共享相同的基类型。
标签: c# backend code-organization