-1

接口公开了一些方法,我们在类中使用该方法,但接口没有定义部分,那么它是如何在 c# 中工作的。例如

class ProductNameComparer : IComparer
{
   public int Compare(object x, object y)
   {
      Product first = (Product)x;
      Product second = (Product)y;
     return first.Name.CompareTo(second.Name);
   }
}

这里IComparer公开了CompareTo()方法,但IComparer没有CompareTo()方法定义部分,那么它是如何工作的?

4

6 回答 6

4

Interface只是合同,它只声明方法而不是具有实现部分....Class实现该特定Interface应具有实现细节。

例如,你有IAnimal接口并且Dog是一个实现IAnimal接口的类,

    public interface IAnimal
    {
        void Walk(); // Just declares the method, not implemenation
    }

    //Class implementing the interface 
    //must define the method specified in the interface
    class Dog : IAnimal
    {
        public void Walk()
        {
            Console.WriteLine("Dog can walk");
        }
    }

在您的示例中,您误解了IComparer界面。

IComparerCompare()用方法定义接口

然而

CompareTo()IComparable 接口声明。

在上面的代码中,您已经实现了 IComparer 接口,因此您正在类中定义Compare()方法细节ProductNameComparer

于 2013-04-25T08:24:47.287 回答
1

接口没有任何实现,它只是关于某事应该如何工作的合同。

您不能创建接口的实例,只能创建实现该接口的实际类(或结构)的实例。如果您获得对接口的引用,则它指向实现该接口的实际对象。

任何实现该接口的类都必须实现该接口的所有成员,因此如果您有一个适合该接口的实际对象,您就知道该方法已实现。

您可以在不了解任何实现它的类的情况下使用接口,因此您甚至可以在接口的任何实际实现之前编写使用接口的代码。

于 2013-04-25T08:27:13.573 回答
1

这里IComparer公开了CompareTo()方法,但IComparer没有CompareTo()方法定义部分,那么它是如何工作的?

如果这是您的问题,我认为您非常误解正在发生的事情以及“暴露”的含义。

使用您的示例:

class ProductNameComparer : IComparer
{
   public int Compare(object x, object y)
   {
      Product first = (Product)x;
      Product second = (Product)y;
      return first.Name.CompareTo(second.Name);
   }
}

您的ProductNameComparer班级正在实施 IComparer。实现的需求类IComparer是它们包含一个带有签名的方法Compare(object x, object y)。这是你唯一ProductNameComparer暴露的东西。那不是别的。

现在你CompareTo()在方法中使用,但你没有公开它。如果不知道 的定义,很难更详细地解释Product.Name,但我们假设它是一个字符串。

System.String实现IComparable(在其他接口中),所以string有一个CompareTo()方法。您只是String.CompareTo()在调用您的方法,但没有暴露任何内容。

于 2013-04-25T08:57:33.087 回答
0

在开始编程之前,您应该阅读一个好的 c# 教程。

http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners

于 2013-04-25T08:25:49.617 回答
0

CompareTo方法不是来自,IComparer但它是您的财产的方法first.Name,我认为它是一个字符串。

于 2013-04-25T08:31:53.943 回答
0

接口定义类型之间的契约,它们不定义实现,这取决于实现interface.

考虑:

interface IWorkable
{
    void DoWork();
}

然后实现:

public class GoodWork : IWorkable
{
    public void DoWork()
    {
        //add the implementation here
    }
}
于 2013-04-25T08:24:54.010 回答