static method cannot implement interface method, why?

后端 未结 6 1295
刺人心
刺人心 2021-02-20 04:24
interface IXXX
{
    void Foo();
}

class XXX : IXXX
{
    public static void Foo()
    {
        Console.WriteLine(\"From XXX\");
    }
}


class Program 
{
    static          


        
相关标签:
6条回答
  • 2021-02-20 04:34

    Well, I believe it should allowed in case of generic type parameter. It probably simplified contractual singleton class. Here is an example:

    public interface IEntity {
       // some constrains...
      DataRow ObjToRow(object obj);
      object RowToObj(DataRow dr);
    }
    
    //T would be any class inherites from IEntity with default contructor signature.
    public interface IMyContract {
      T read<T>() where T : IEntity;  
      void write<T>(T object) where T : IEntity;
    }
    
    //everything in the class is static
    public static class SqlProvider : IMyContract {
    
      public static T read<T>() where T: IEntity {
        DataRow dr = [reading from database]
        return T.RowToObj(dr);
      }
    
      //compile error here....
      public static void write<T>(T obj) where T : IEntity {
        DataRow dr = T.ObjToRow(obj);
    
       [ ... commit data row dr to database ... ]
    
      }
    }
    
    public static class MyAppleEntity : IEntity  {
      [... implement IEntity contract normally ... ]
    }
    
    public static class MyOrangeEntity : IEntity {
       [... implement IEntity contract normally ... ]
    }
    
    public class MyTest {
      void reading() {
         MyAppleEntity apple = SqlProvider.Read<MyAppleEntity>();
         MyOrangeEntity orange = SqlProvider.Read<MyOrangeEntity>();
    
         SqlProvider.write<MyAppleEntity>(apple); 
         SqlProvider.write<MyOrangeEntity>(orange);
      } 
    
    }
    

    The only time a type reference implicitly is in the SqlProvider.read() and write() and T is well identity at point of invoke. Without static implementation of interface I'm forced to write like this.

    public class MyAppleEntity : IEntity  {
      [... implement IEntity contract normally ... ]
    }
    
      .....
    
      public T read<T>() where T: IEntity, new() {
        DataRow dr = [reading from database]
        return new T().RowToObj(dr);
      }
    

    Very little different but not quite as elegant.

    0 讨论(0)
  • 2021-02-20 04:37

    See this thread from JoelOnSoftware describing the reasons behind this.

    Basically the interface is the contract between the consumer and the provider, and a static method belongs to the class, and not each instance of the class as such.

    An earlier question on SO also deal with the exact same question: Why Doesn't C# Allow Static Methods to Implement an Interface?

    0 讨论(0)
  • 2021-02-20 04:43

    IF we look at interfaces as a promise that an object can perform the methods listed in the interface, then ths idea of static implementation becomes problematic. If the implemetion is static, then you can't write new ImplementingObject().ImplementedMthod. The object can't perform the method, the class can.

    0 讨论(0)
  • 2021-02-20 04:44

    You use interface to avoid using concrete class during instantiation. You can't access static method through instantiated class, so implementing interface methods with static methods is not allowed.

    0 讨论(0)
  • 2021-02-20 04:53

    Because interface member are public and overridable, and that static method cannot by design be overrided or abstract, Interfaces are here to define an accessible contract that must be implemented by their concrete implementation (with as many steps of abstract implementations & inherited interfaces between) and as far as I know there is no way to create an abstract static method.

    0 讨论(0)
  • 2021-02-20 04:56

    An interface defines the behaviour that an object must respond to. As Foo is a static method, the object doesn't respond to it. In other words, you couldn't write...

    XXX myXXX = new XXX();
    myXXX.Foo();
    

    In other words, myXXX doesn't fully satisfy the requirements of the interface.

    0 讨论(0)
提交回复
热议问题