以下是我要做的一个例子。
public class A
{
public virtual void DoSomething(string a)
{
// perform something
}
}
public class B : A
{
public Override void DoSomething(string a, string b)
{
// perform something slightly different using both strings
}
}
所以我想从A类中覆盖DoSomething并允许它传递第二个参数。这可能吗?
答案 0 :(得分:10)
当覆盖virtual
方法时,您必须保留原始"合同"方法,在您的情况下是string a
变量。
为了做你想做的事,你可以创建一个带有两个字符串的虚拟重载:
public class A
{
public virtual void DoSomething(string a)
{
// perform something
}
public virtual void DoSomething(string a, string b)
{
// perform something
}
}
public class B : A
{
public override void DoSomething(string a, string b)
{
// perform something slightly different using both strings
}
}
如果你想要的是接受方法中的N个字符串,可以使用params
关键字:
public class A
{
public virtual void DoSomething(params string[] allStrings)
{
// Do something with the first string in the array
// perform something
}
}
答案 1 :(得分:0)
不,这不会奏效。覆盖方法时需要具有相同的原型。
答案 2 :(得分:0)
不,这会超载。由于逻辑将略有不同'听起来你还需要两种不同的方法吗?您可以将类似的逻辑放在第三种方法中,并从DoSomething(string A)
和DoSomething(string A, string B)
答案 3 :(得分:0)
轻微坏死,但是当您重载时,可以从新方法中调用原始方法。
如此
public class B : A {
public virtual void DoSomething (string a, string b) {
base.DoSomething(_a);
//Do B things here
}
}
这允许您修改方法而不是完全重做:)
答案 4 :(得分:0)
有一种方法。它需要一些代码。您创建一个大师级的fex。 “机器参数”。然后创建子类,例如“ MachineParamsGeneral”,“ MachineParamsDetail”。
您的功能现在类似于:
public override void Setup(MachineParams p)
{
// since you know what subclass this is inside, you can simple cast
MachineParamsGeneral g = (MachineParamsGeneral)p;
float paramExample = p.paramExample;
}
您需要考虑此解决方案是否足够“方便”以适应您的规模。
第二种解决方案:
public override void Setup(params object[] p ..)
{
// you need to know the arrangement of values inside the object array
float x = (float)p[0]; // not strictly speaking type-safe
}