正在更改传递给虚拟方法的类型
本文关键字:虚拟 方法 类型 | 更新日期: 2023-09-27 18:20:12
我有一个关于在虚拟方法中更改参数类型的问题。首先,我将解释这个场景。
这是用户可以执行命令的基本界面
public interface IUserThatExecutesCommands
{
bool IsInRole(string role);
}
这是基础界面的扩展,要求用户具有Eminence 的概念
public interface IUserThatExecutesEminenceCommands : IUserThatExecutesCommands
{
int Eminence { get; }
}
现在这是基本的抽象UserCommand类,它定义了IUserThatExecutesCommands
使用的命令
public abstract class UserCommand
{
public virtual bool CanBeExecutedBy(IUserThatExecutesCommands user)
{
// For the purpose of simplification I have not included the actual implementation of this method.
return UserIsInOneOfAllowedRoles(user);
}
}
这里是该类的一个扩展,它引入了Eminence的概念,因此需要使用IUserThatExecutesEminenceCommands
。目前,这会导致编译器错误,因为我已经更改了传入的使用类型
public abstract class EminenceCommand : UserCommand
{
public override bool CanBeExecutedBy(IUserThatExecutesEminenceCommands user)
{
return user.Eminence >= _requiredEminence;
}
}
我的问题是,有没有一种方法可以覆盖CanBeExecutedBy
函数,这样我就可以更改传入的用户类型?我希望能够扩展UserCommand类,但由于这个问题,目前我无法扩展。
感谢
试试这个:
public abstract class EminenceCommand : UserCommand
{
public override bool CanBeExecutedBy(IUserThatExecutesCommands user)
{
// Dynamically check the type of user passed in and only check priveleges if correct type
IUserThatExecutesEminenceCommands u = user as IUserThatExecutesEminenceCommands;
if( u == null) {
return false;
}
return u.Eminence >= _requiredEminence;
}
}
一旦为虚拟函数建立了签名,它就变成了一个不能更改的契约。但是,您可以将user
参数测试为CanBeExecutedBy
,看看它是否支持任何所需的接口。所以,你的方法应该是这样的:
public override bool CanBeExecutedBy(IUserThatExecutesCommands user)
{
IUserThatExecutesEminenceCommands u = user as IUserThatExecutesEminenceCommands;
if (u == null)
{
// TODO: Ignore the arg, throw an exception or do something else.
return false;
}
return u.Eminence >= _requiredEminence;
}