操纵方法功能调用

时间:2010-06-08 15:29:43

标签: c#

是否可能在c#中具有某种基类功能,这些功能会根据类略微操作。比如说我有以下代码(显然不会编译它只是为了演示目的)

class BaseFunctionality
{
    public virtual bool adminCall
    public static string MethodName(int id, string parameter)
    { 
        if (adminCall)
            return dbcall.Execute();
        else
            return dbcall.ExecuteMe();
    }
}
class Admin : BaseFunctionality
{
    override bool adminCall = true;
}
class Front : BaseFunctionality
{
    override bool adminCall = false;
}

现在我想做的是;

string AdminCall = Admin.MethodName(1, "foo");
string FrontCall = Front.MethodName(2, "bar");

他们有办法做这样的事吗?我正在尝试使用静态方法做所有事情,所以我不必一直实例化类,并且有一个很好的干净代码,只能在一个地方被操作。

这背后的想法是,重复使用最少的代码并使事情更容易扩展,因此,例如,另一个类可以在以后实现BaseFunctionality。

3 个答案:

答案 0 :(得分:4)

当然可以这样做。它被称为模板模式。

然而,“试图用静态方法做所有事情”会很快毁掉你。首先,您不能覆盖继承者中的静态方法。实例化和使用对象是面向对象编程的全部内容。创建实例正是允许您减少代码重复的原因 - 您仍然只在一个地方操作代码,但该代码可以执行许多不同的操作并在运行时处于不同的状态。

此外,不是在基类中使用adminCall标志,而是覆盖方法来执行不同的行为,并将公共功能考虑到其他方法中(这是{ {1}}修饰符发挥作用。)

例如:

protected

通过避免基类中的public abstract class BaseFunctionality { public abstract string methodName(int id, string parameter); protected ThingClass createThing(int id, string parameter) { // instantiate and return result } protected bool isValidId(int id) { // evaluate validity of id } } public class Admin : BaseFunctionality { public override string methodName(int id, string parameter) { if(!isValidId(id)) return string.Empty; var thing = createThing(id, parameter); thing.Execute(); } } public class Front : BaseFunctionality { public override string methodName(int id, string parameter) { if(!isValidId(id)) return null; Console.WriteLine(parameter); } } 内容,您可以在if…then方法中使用任意数量的继承者执行任意数量的不同操作,而无需对{{1}进行任何更改} class(顺便说一句,指的是开放式原则 - 你的类对扩展开放 - 你可以让他们做一些新事物 - 但是已关闭修改 - 您实际上并没有进入并对该类的代码进行任何更改。)

答案 1 :(得分:3)

您希望使用静态方法会妨碍正确使用继承。示例中的基类知道如何实现两个子类的功能。一种更清晰的编码方式是:

    abstract class BaseFunctionality
    {
        public abstract string MethodName(int id, string parameter);
    }

    class Admin : BaseFunctionality
    {
        public override string MethodName(int id, string parameter)
        {
            return "dbcall.Execute()";
        }                        
    }

    class Front : BaseFunctionality
    {
        public override string MethodName(int id, string parameter)
        {
            return "dbcall.ExecuteMe()";
        }
    }

如果必须具有静态访问权限,则可以创建其他静态方法或使用单例访问这些方法。 e.g:

string AdminCall = Admin.Instance.MethodName(1, "foo");

答案 2 :(得分:0)

您正在尝试做的事情似乎完全属于类和继承的模式。你有BaseFunctionality一般超类和两个更具体的子类。您正在使用adminCall布尔标志来区分这两者,但更好的设计是在两个特定的子类中有两个不同的MethodName实现。

这样你可以根据需要拥有一些稍微修改过的MethodName版本(每个子类一个),并且可以简单地在任何'obj'上调用obj.MethodName(string),它是BaseFunctionality的实例或者任何子类。