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