代码之家  ›  专栏  ›  技术社区  ›  Jader Dias

如何用虚方法显式实现接口?

  •  5
  • Jader Dias  · 技术社区  · 14 年前

    我不能这样做

    interface InterfaceA
    {
        void MethodA();
    }
    
    class ClassA : InterfaceA
    {
        virtual void InterfaceA.MethodA()
        // Error: The modifier 'virtual' is not valid for this item
        {
        }
    }
    

    以下工作地点

    class ClassA : InterfaceA
    {
        public virtual void MethodA()
        {
        }
    }
    

    为什么?如何规避这一点?

    5 回复  |  直到 14 年前
        1
  •  8
  •   Community Lee Campbell    7 年前

    我认为这是因为当一个成员 显式实现时,不能通过类实例访问,只能通过接口的实例访问。

    因此,在这种情况下,使某个“虚拟”的东西真正没有意义,因为虚拟意味着您打算在继承的类中重写它。实现接口 明确地 制造它 事实上的 会是矛盾的。这也可能是编译器不允许这样做的原因。

    为了解决这个问题我想 csharptest.net's Philip's 答案听起来像是在耍花招

        3
  •  3
  •   Philip Rieck    14 年前

    根据C语言规范:

    这是一个编译时错误 显式接口成员 实现包括访问 修饰符,它是编译时 包含修饰符时出错 抽象、虚拟、重写或 静态的。

    只有从显式接口实现中调用虚拟方法,才能“绕过”它。

        4
  •  3
  •   csharptest.net    14 年前

    你必须这样做:

    interface InterfaceA
    {
        void MethodA();
    }
    
    class ClassA : InterfaceA
    {
        void InterfaceA.MethodA()
        { MethodB(); }
    
        protected virtual void MethodB()
        { 
        }
    }
    

    通常这是一种更好的方法,因为内部方法可以在不更改接口的情况下更改签名。举个更真实的单词例子:

    interface IOrderDetails
    {
        void PlaceOrder();
    }
    
    //Sometime later you extend with:
    interface IOrderDetails2 : IOrderDetails
    {
        void PlaceOrder(IUser user);
    }
    
    //Implementation
    class Order : IOrderDetails, IOrderDetails2
    {
        static readonly IUser AnonUser;
    
        void IOrderDetails.PlaceOrder()
        { OnPlaceOrder(AnonUser); }
        void IOrderDetails2.PlaceOrder(IUser user)
        { OnPlaceOrder(user); }
    
        protected virtual void OnPlaceOrder(IUser user)
        { 
        }
    }
    

    在这里,您可以看到添加了iorderdetails2,我们可以安全地重构现有的虚拟方法(从而为派生生成编译时错误)。此外,这通常允许您在基本实现类中提供公共功能、日志记录和异常处理…

        5
  •  0
  •   Lukasz Madon    14 年前

    不能将虚拟修饰符与static、abstract和 私有的 或重写修饰符。 默认修饰符是private

    推荐文章