C# Override with different parameters?

后端 未结 5 1513
天命终不由人
天命终不由人 2020-12-11 16:29

Here is an example of what I am looking to do.

public class A
{
    public virtual void DoSomething(string a)
    {
      // perform something
    }
}
public         


        
相关标签:
5条回答
  • 2020-12-11 16:41

    When overriding a virtual method, you must keep the original "contract" of the method, which in your case is a string a variable.

    In order to do what you want, you can create a virtual overload which takes two strings:

    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
        }
    }
    

    If what you want is to accept N strings in your method, you can use the params keyword:

    public class A
    {
        public virtual void DoSomething(params string[] allStrings)
        {
          // Do something with the first string in the array
          // perform something
        }
    }
    
    0 讨论(0)
  • 2020-12-11 16:41

    No, this won't work. When overriding the methods needs to have the same prototype.

    0 讨论(0)
  • 2020-12-11 16:47

    No, this would be overloading. Since the logic would be 'slightly different' it sounds like you would need two different methods anyway? You could put your similar logic in a 3rd method and call that from both DoSomething(string A) and DoSomething(string A, string B)

    0 讨论(0)
  • 2020-12-11 16:51

    Slight necro, but when you overload you can call the original method from the new one.

    so

    public class B : A {
    
        public virtual void DoSomething (string a, string b) {
            base.DoSomething(_a);
            //Do B things here
        }
    }
    

    This allows you to modify the method instead of completely redoing it :)

    0 讨论(0)
  • 2020-12-11 16:57

    There is a way. It requires some code though. You create a master class fex. 'MachineParams'. Then create subclasses like 'MachineParamsGeneral', 'MachineParamsDetail'.

    Your function can now be like:

    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;
    }
    

    You need to consider if this solution is "handy" enough for your scale.

    A second solution:

    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
    }
    
    0 讨论(0)
提交回复
热议问题