define interface method with different parameters in C#

后端 未结 4 1080
生来不讨喜
生来不讨喜 2021-01-18 14:23
interface parentInterface
{
   public String methodA(/*define parameters name and dataType*/);
}

and

public class childA : parentIn         


        
相关标签:
4条回答
  • 2021-01-18 15:01

    You have two different methods

    public String methodA(String a, int b, String c, long d){}
    

    and

    public String methodA(int e, String f, String g){}
    

    that represent two different contracts to childA and childB respectively. You cannot define an interface with a single methodA that fits both definitions. What you seek to do is not possible.

    Note that you could define both overloads in your interface, but then each class implementing that interface would have to implement both overloads.

    0 讨论(0)
  • 2021-01-18 15:06

    You could use an interface method with a variable number of arguments using the params keyword. But you then need to cast each argument to the appropriate type, which is a bit error prone.

    public interface IFoo
    {
        void DoWork(params object [] arguments);
    }
    
    public class Foo : IFoo
    {
        public void DoWork(params object [] arguments)
        {
            string a = (string)arguments[0];
            int b = (int)arguments[1];
            string c = (string)arguments[2];
            long d = (long)arguments[3];
    
            Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a,b,c,d);
        }
    }
    
    public class AnotherFoo : IFoo
    {
        public void DoWork(params object [] arguments)
        {       
            int e = (int)arguments[0];
            string f = (string)arguments[1];
            string g = (string)arguments[2];
    
            Console.WriteLine("e={0}, f={1}, g={2}", e,f,g);
        }
    }
    
    void Main()
    {
        var foo = new Foo();    
        foo.DoWork("a",1, "c",2L);
    
        var foo1 = new AnotherFoo();    
        foo1.DoWork(1,"f", "g");
    }
    
    0 讨论(0)
  • 2021-01-18 15:06

    Methods with different parameters cannot both implement the same interface method declaration. If your method signature does not match that of the interface, you are not implementing the interface.

    You can achieve this though, but it is not a good design since the interface is not telling you anything about the method:

    interface parentInterface
    {
        string methodA(params object[] asd);
    }
    
    
    public class childA : parentInterface
    {
        public string methodA(params object[] p)
        {
            string a = p[0] as string;
            int b = (int)p[1];
            string c = p[2] as string;
            long d = (long)p[3];
            return string.Empty;
        }
    }
    
    public class childB : parentInterface
    {
        public string methodA(params object[] p)
        {
            int e = (int)p[0];
            string f = p[1] as string;
            string g = p[2] as string;
            return string.Empty;
        }
    }
    
    0 讨论(0)
  • 2021-01-18 15:17

    Make a New Parameter

    This can often be solved by using a class or struct to use as single parameter rather than the built-in Types.

    The Interface

    You know what to expect from a class when it implements a familiar interface. We know that all classes implementing the IEnumerable interface can be used in a foreach loop. By convention, the name of the interface is "I" followed by a description of an ability. It is typical for the name to end with the suffix "-able".

    -able   Suffix forming adjectives meaning:
               1   -able to be [as in] calculable.
               2   -having the quality of [as in] comfortable.

    Oxford English Dictionary

    Let's rename parentInterface and MethodA() to give a clear example of how this normally works (and to avoid negative sanctions):

    public interface ITreatable
    {
        Treatment GetTreatment();
    }
    

    Well, finding the cure may not be so easy, even if the object represents a treatable illness. Here's some examples:

    public class TheFlu : ITreatable
    {
        public Treatment GetTreatment(int year)
        {
            // return some object, Treatment, based on the flu season.
        }
    }
    
    public class Hangover : ITreatable
    {
        public Treatment GetTreatment()
        {
            return Treatment.Empty; // no parameters necessary.
        }
    }
    
    public class Insomnia : ITreatable
    {
        public Treatment GetTreatment(FamilyHistory occurances, LabResult lab)
        {
            // return Some Treatment object that can be different based on the
            // calculated risk from the arguments.
        }
    }
    

    What We're Really Missing Here

    I don't know biology, but the concept is still the same. You have a group of ITreatable illness objects that need to have a GetTreatment() method; however, they use different criteria for making calculations. We need Symptoms.

    public class Symptoms
    {
        public FamilyHistory History;
        public DateTime Time;
        public LabResult Lab;
        public BloodTest BloodTest;
        public TimeSpan SymptomTime;
        public IsCritical IsCritical;
    }
    

    Now, the objects can parse the symptoms in their own method, and our interface will look like this:

    public interface ITreatable
    {
        Treatment GetTreatment(Symptoms symptoms);
    }
    
    0 讨论(0)
提交回复
热议问题