是否可能在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。
答案 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的实例或者任何子类。