【问题标题】:How to call a particular explicitly declared interface method in C#如何在 C# 中调用特定显式声明的接口方法
【发布时间】:2013-02-25 20:46:45
【问题描述】:

我对如何在以下代码中调用特定接口(比如 IA 或 IB 或 In...)的方法有疑问。请帮助我如何打电话。我已经注释了我声明接口方法“公共”的代码行,在这种情况下它可以工作。当我明确声明时我不知道如何调用它:(我正在学习 C#....

interface IA
    {
        void Display();
    }
    interface IB
    {
        void Display();
    }
    class Model : IA, IB
    {
        void IA.Display()
        {
            Console.WriteLine("I am from A");
        }
        void IB.Display()
        {
            Console.WriteLine("I am from B");
        }
        //public void Display()
        //{
        //    Console.WriteLine("I am from the class method");
        //}

        static void Main()
        {
            Model m = new Model();
            //m.Display();
            Console.ReadLine();
        }
    }

【问题讨论】:

  • 您阅读文档了吗?你自己尝试过什么吗?您在执行此操作时遇到了哪些问题?
  • 您好 wRAR,当我隐式声明时,我尝试调用 Display。但是,是的,我从来没有尝试过,因为当我想显式调用接口方法时,我不知道如何调用它......现在我通过下面的帮助了解了:) 干杯
  • 您没有回答是否已阅读有关该主题的文档。他们有答案并包含示例。
  • 好吧,对不起,没有检查:0 在我进一步怀疑之前一定会记住这一点。 :) 干杯
  • 请记住,您应该阅读文档,并且请其他人解释您自己没有尝试理解的事情是不礼貌的。

标签: c# .net interface


【解决方案1】:

要调用显式接口方法,您需要使用正确类型的变量,或者直接转换为该接口:

    static void Main()
    {
        Model m = new Model();

        // Set to IA
        IA asIA = m;
        asIA.Display();

        // Or use cast inline
        ((IB)m).Display();

        Console.ReadLine();
    }

【讨论】:

  • 也许 (m as IB).Display() 会更具可读性,尽管 +1
  • 嗨 Reed,非常感谢,它可以工作,但老实说,我不明白 IA asIA = m 是什么意思。它的任务?我的意思是,我不明白它是如何工作的,你能用一些基本的术语解释一下吗?我将不胜感激:) :)
  • (m as IB).Display() 并不好,因为它带有错误的语义。如果您知道x 类型为T,请始终使用(T)xx as T 是针对x 可能是T 类型的情况,然后您通过测试是否得到null 来检查。
  • @Divine 您正在将实例分配给“IA”类型的变量。由于该类实现了 IA,因此分配是合法的。当你调用asIA.Display()时,它是通过接口调用的,所以你得到了显式的实现。
  • @Divine 两者都不是更昂贵的 - 你会使用适合你的场景的那个。通常,如果您正在实现一个接口,那是因为您将创建针对该接口而不是针对类本身的例程。在某些时候,您最终会将实例“分配”给接口定义的变量。这可能是一个方法调用参数,显式等 - 这真的没关系。任务本身非常便宜,所以这不是“成本”问题,而是意图问题。
【解决方案2】:

将被调用的方法取决于调用它的类型。例如:

注意,为了清楚起见,我创建了两个项目。但在实践中,您不想这样做,您应该在类型之间转换对象。

static void Main(string[] args)
{
    // easy to understand version:
    IA a = new Model();
    IB b = new Model();

    a.Display();
    b.Display();

    // better practice version:
    Model model = new Model();

    (IA)model.Display();
    (IB)model.Display();
}

interface IA
{
    void Display();
}

interface IB
{
    void Display();
}

class Model : IA, IB
{
    void IA.Display()
    {
        Debug.WriteLine("I am from A");
    }

    void IB.Display()
    {
        Debug.WriteLine("I am from B");
    }            
}

输出:

I am from A
I am from B

【讨论】:

  • 非常感谢亚当,这很简单 :) :) 干杯
  • 我创建了两个项目只是为了清楚起见,但我不建议在实践中这样做,我建议您遵循 Reed Copsey 的回答。很高兴它可以帮助您理解!
  • 非常感谢 Adam,是的,正如你所说,当我作为新手第一次看到它时,它对我来说是非常清晰和简单的代码 :) 会记住 Reed 建议的最佳实践。 ..再次感谢亚当... :)
  • 我在代码中添加了一个小改动,可能比此处发布的其他答案更具可读性。
  • 太棒了,听起来都很好理解,再次感谢 :) 干杯
【解决方案3】:

为了调用显式接口方法,您必须持有对该接口类型的引用或对其进行强制转换:

IB ib = new Model();
ib.Display();

IA ia = (IA)ib;
ia.Display();

【讨论】:

  • 那是完美的工作谢谢:) :) 我可以知道 IA ia = new Model() 和 IA ia = (IA)ib 之间的区别吗?是否称为将一种类型转换为另一种类型?
  • @Divine 意思是ib,因为Model实现了IA,可以CAST到IA,就像它可以被转换回Model一样。但是,仅实现 IB 的对象无法转换为 IA。这里的所有答案都非常相似。
  • 非常感谢您的帮助并让我理解 :) 我真的很感激,干杯 :)
【解决方案4】:

您需要在此过程中使用 explicit interface implementation

如果两个接口成员不执行相同的功能, 但是,这可能会导致其中一项或两项的错误实施 的接口。可以实现接口成员 显式地——创建一个只通过 接口,并且特定于该接口。这是通过 用接口名称和句点命名类成员。

interface IA
{
   void Display();
}
interface IB
{
   void Display();
}

    public class Program:IA,IB
    {

        void IA.Display()
        {
            Console.WriteLine("I am from A");
        }

        void IB.Display()
        {
            Console.WriteLine("I am from B");
        }

        public static void Main(string[] args)
        {
           IA p1 = new Program();
           p1.Display();
           IB p2 = new Program();
           p2.Display();
        }
    }

输出将是:

I am from A
I am from B

这是一个DEMO

【讨论】:

  • 非常感谢 Soner 的帮助 :) 欣赏,干杯 :)
猜你喜欢
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 2012-12-28
  • 2016-02-16
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多