C# 更改传入虚拟方法的类型

C# 更改传入虚拟方法的类型,c#,polymorphism,overriding,virtual,C#,Polymorphism,Overriding,Virtual,我有一个关于在虚拟方法中更改参数类型的问题。首先,我将解释这个场景 这是可执行命令的用户的基本界面 public interface IUserThatExecutesCommands { bool IsInRole(string role); } 这是基本界面的扩展,要求用户具有卓越的概念 public interface IUserThatExecutesEminenceCommands : IUserThatExecutesCommands { int Eminence {

我有一个关于在虚拟方法中更改参数类型的问题。首先,我将解释这个场景

这是可执行命令的用户的基本界面

public interface IUserThatExecutesCommands
{
   bool IsInRole(string role);
} 
这是基本界面的扩展,要求用户具有卓越的概念

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);
   }
}
下面是该类的扩展,它引入了卓越的概念,因此需要使用
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; 
        } 
} 
试试这个:

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
参数到
canbeecutedby
并查看它是否支持任何所需的接口。因此,您的方法如下所示:

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

一旦你为一个虚拟函数建立了一个签名,它就变成了一个你不能改变的契约。但是,您可以测试
user
参数到
canbeecutedby
并查看它是否支持任何所需的接口。因此,您的方法如下所示:

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