代码之家  ›  专栏  ›  技术社区  ›  dan richardson

操作方法功能调用

c#
  •  0
  • dan richardson  · 技术社区  · 14 年前

    在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");
    

    他们有什么办法做这种事吗?我试图用静态方法来做每件事情,这样我就不必一直实例化类,并且拥有干净的代码,这些代码只在一个地方被操作。

    这背后的想法是,代码重复最少,并且使事情更容易扩展,例如,另一个类稍后可以实现基本功能。

    3 回复  |  直到 9 年前
        1
  •  3
  •   Mark Heath    14 年前

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

        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()";
            }
        }
    

    然后,您可以创建其他静态方法,或者在必须具有静态访问权的情况下使用singleton来访问这些方法。例如。:

    string AdminCall = Admin.Instance.MethodName(1, "foo");
    
        2
  •  4
  •   Jay    14 年前

    当然可以。这叫做模板模式。

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

    另外,不要使用 adminCall 基类中的标志,重写 方法 执行不同的行为,并将公共功能考虑到其他方法中(这是 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 在基类中,可以有任意数量的继承者在 methodName 方法,而不必对 BaseFunctionality 类(顺便说一下,是指 开闭原理 --你的课程是开放的 延伸 --你可以让他们做一些新的事情——但是接近 修改 --实际上,您不会进入并对该类的代码进行任何更改)。

        3
  •  0
  •   AndreiM    14 年前

    您所要做的似乎完全落入了类和继承的模式中。您有您的基本功能通用超级类和两个更具体的子类。您正在使用admincall布尔标志来区分这两个类,但更好的设计是在两个特定的子类中使用两个不同的methodname实现。

    通过这种方式,您可以根据需要拥有尽可能多的稍微修改过的methodname版本(每个子类一个),并且可以简单地在作为basefunctionality或任何子类实例的任何“obj”上调用obj.methodname(string)。