Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 操纵方法功能调用_C# - Fatal编程技术网

C# 操纵方法功能调用

C# 操纵方法功能调用,c#,C#,在c#中是否可能有一些基类功能,这些功能是根据类稍微进行操作的。例如,假设我有以下代码(很明显,它不会编译,只是为了演示目的) 现在我想做的是 string AdminCall = Admin.MethodName(1, "foo"); string FrontCall = Front.MethodName(2, "bar"); 他们有没有办法这样做?我试图用静态方法来做所有的事情,这样我就不必一直实例化类,并且有很好的干净代码,只在一个地方进行操作 这背后的想法是,代码重复最少,并使事情更容

在c#中是否可能有一些基类功能,这些功能是根据类稍微进行操作的。例如,假设我有以下代码(很明显,它不会编译,只是为了演示目的)

现在我想做的是

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

他们有没有办法这样做?我试图用静态方法来做所有的事情,这样我就不必一直实例化类,并且有很好的干净代码,只在一个地方进行操作


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

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


通过这种方式,您可以根据需要对MethodName有任意多个稍加修改的版本(每个子类一个),并且只需在作为BaseFunctional或任何子类的实例的任何“obj”上调用obj.MethodName(string)。

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

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

当然你能做到。它被称为模板模式

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

另外,不要在基类中使用
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
类进行任何更改(顺便说一句,这是指开闭原则——你的类对扩展是开放的——你可以让它们做一些新的事情——但对修改是封闭的——你实际上不需要对该类的代码进行任何更改).

您不想实例化对象有什么特别的原因吗?我认为如果您创建了BaseFunctional子类的实例,这个问题将变得很简单。“我尝试用静态方法来完成所有事情,所以我不必一直实例化类”重新发明轮子实际上会使维护变得更加困难,并且在未来变得更加脆弱。坚持继承和覆盖基本情况功能或组合,并使用策略或装饰器模式之类的东西添加新功能。我认为问题在于我只是试图过多地简化事情。下面的想法是这个问题是因为dbcall方法实际上会调用功能,这取决于adminCall bool,确定返回的不同数据库列,其中一些列是相同的,无论是前台调用还是管理员调用。@Martinho是的,我做的大多数事情都是面向对象的,并使用继承,不幸的是我是自学成才的,所以有时我只需要被告知我正在尝试做的事情是愚蠢的,并且潜意识里做我认为最好的事情:)谢谢Mark,这和我已经拥有的东西很相似。不过,关于实例化和静态访问器,我有一个问题。如果我让您的代码保持原样,显然我必须通过实例化来调用方法,因此字符串s=new Admin().MethodName(3“”);因此,使用静态方法并创建一个单例模式(我已经这样做了),使用单例模式是否比每次调用一个方法(这是我希望在静态方法/单例模式中使用东西的原因)时不断实例化Admin更有益,在不了解系统功能的情况下,很难给出明确的答案。如果代码中有几个地方需要调用这个函数,所有的函数都散布在不同的文件中,那么您应该考虑有一个接口作为依赖关系传递。使用静态方法/单例是可以的,只要您认识到使用它们的每个人现在都紧密地耦合到具体的类,这通常会降低代码的可测试性。我创建了两个cms系统,显然有一个管理区域,然后是前端/消费端。因此,一个真正的工作示例是成员功能。有些功能是共享的(获取信息、更新信息、更改电子邮件等),但差别很小-例如,管理方允许更改成员类型,而消费者在信息更新期间无法更改。这意味着90%的时间代码是相同的(数据库调用、类实例化/填充、读取数据库列名称),所以我认为接口或抽象基类可以工作?
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);
    }
}