C# 接口问题

发布于 2024-11-08 15:31:04 字数 1035 浏览 0 评论 0原文

我有以下代码:

// IMyInterface.cs

namespace InterfaceNamespace
{
    interface IMyInterface
    {
        void MethodToImplement();
    }
}

.

// InterfaceImplementer.cs
class InterfaceImplementer : IMyInterface
{
    void IMyInterface.MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}

这段代码编译得很好(为什么?)。但是,当我尝试使用它时:

// Main.cs

    static void Main()
    {
        InterfaceImplementer iImp = new InterfaceImplementer();
        iImp.MethodToImplement();
    }

我得到:

InterfaceImplementer 不包含“MethodToImplement”的定义

MethodToImplement 从外部是不可见的。但如果我进行以下更改:

// InterfaceImplementer.cs
class InterfaceImplementer : IMyInterface
{

    public void MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}

那么 Main.cs 也可以正常编译。为什么这两者之间有区别?

I have the following code:

// IMyInterface.cs

namespace InterfaceNamespace
{
    interface IMyInterface
    {
        void MethodToImplement();
    }
}

.

// InterfaceImplementer.cs
class InterfaceImplementer : IMyInterface
{
    void IMyInterface.MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}

This code compiles just fine(why?). However when I try to use it:

// Main.cs

    static void Main()
    {
        InterfaceImplementer iImp = new InterfaceImplementer();
        iImp.MethodToImplement();
    }

I get:

InterfaceImplementer does not contain a definition for 'MethodToImplement'

i.e. MethodToImplement is not visible from outside. But if I do the following changes:

// InterfaceImplementer.cs
class InterfaceImplementer : IMyInterface
{

    public void MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}

Then Main.cs also compiles fine. Why there is a difference between those two?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

菊凝晚露 2024-11-15 15:31:04

通过显式实现接口,您正在创建一个私有方法,该方法可以只能通过转换到接口来调用。

By implementing an interface explicitly, you're creating a private method that can only be called by casting to the interface.

故事还在继续 2024-11-15 15:31:04

不同之处在于支持接口方法与另一个方法冲突的情况。引入了“显式接口实现”的思想。

您的第一次尝试是显式实现,它需要直接使用接口引用(而不是对实现该接口的内容的引用)。

您的第二次尝试是隐式实现,它也允许您使用实现类型。

要查看显式接口方法,请执行以下操作:

MyType t = new MyType();
IMyInterface i = (IMyInterface)t.
i.CallExplicitMethod(); // Finds CallExplicitMethod

如果您随后满足以下条件:

IMyOtherInterface oi = (MyOtherInterface)t;
oi.CallExplicitMethod();

类型系统可以在正确的类型上找到相关方法而不会发生冲突。

The difference is to support the situation where an interface method clashes with another method. The idea of "Explicit Interface Implementations" was introduced.

Your first attempt is the explicit implementation, which requires working directly with an interface reference (not to a reference of something that implements the interface).

Your second attempt is the implicit implementation, which allows you to work with the implementing type as well.

To see explicit interface methods, you do the following:

MyType t = new MyType();
IMyInterface i = (IMyInterface)t.
i.CallExplicitMethod(); // Finds CallExplicitMethod

Should you then have the following:

IMyOtherInterface oi = (MyOtherInterface)t;
oi.CallExplicitMethod();

The type system can find the relevant methods on the correct type without clashing.

绝情姑娘 2024-11-15 15:31:04

如果要实现类的接口,那么接口中的方法必须存在于类中,并且所有方法也应该是公共的。

class InterfaceImplementer : IMyInterface
{

    public void MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}

你可以这样调用该方法

IMyInterface _IMyInterface = new InterfaceImplementer();
IMyInterface.MethodToImplement();

if you are implementing an interface to a class then the methods in interface must be there in class and all methods should be public also.

class InterfaceImplementer : IMyInterface
{

    public void MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}

and you can call the method like this

IMyInterface _IMyInterface = new InterfaceImplementer();
IMyInterface.MethodToImplement();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文