Массивы с ненулевой базой и интерфейс - Интерфейсы

ОГЛАВЛЕНИЕ

Интерфейсы

Любой, кто когда-либо занимался программированием COM(модель составных объектов), должен знать интерфейсы. В COM на интерфейс указывают, когда есть попытка обратиться к компоненту COM. Интерфейс является сопряжением между группами семантически связанных функций, на которые указывают виртуальные указатели в виртуальной таблице. Но в C++ наследование класса не всегда то же самое, что и наследование интерфейса. В каркасе Microsoft .NET есть класс System.Object, определяющий 4 открытых метода экземпляра: ToString(), Equals(), GetHashCode() и GetType(). Рассмотрите знакомый код “Привет, мир!”.

using System
class App {
static void Main() {
Console.WriteLine(“Привет, мир!”);
  }
}

Привет, мир!

Теперь запускается программа, загружающая этот управляемый модУль и использующая API(интерфейс прикладного программирования) Reflection для генерации того, что рассмотрено выше:

using System;
using System.IO;
using System.Reflection;
public class Meta {
 public static int Main() {
 Assembly a = Assembly.LoadFrom("hello.exe");
 Module[] m = a.GetModules();
 Type[]  types = m[0].GetTypes();
 Type type = types[0];
 Console.WriteLine("Тип [{0}] имеет следующие методы:", type.Name);
 MethodInfo[] mInfo = type.GetMethods();
 foreach (MethodInfo mi in mInfo)
 {
  Console.WriteLine("  {0}", mi);
  }
 return 0;
      }
}

Этот код компилируется вместе с загрузкой сборки в метод LoadFrom  класса Assembly:

C:\Windows\Microsoft.NET\Framework\v2.0.50727>csc /optimize+ meta.cs 
C:\Windows\Microsoft.NET\Framework\v2.0.50727>meta

Тип [App] имеет следующие методы:

  System.String ToString()
  Boolean Equals(System.Object)
  Int32 GetHashCode()
  System.Type GetType()

Поскольку пространство имен System.Object является корневым классом, все прочие классы наследуют те четыре открытых метода экземпляра. Любой класс, производный от Object, наследует следующее:

•    Сигнатуры методов
•    Реализацию этих методов

Интерфейс – другой способ определения именованного набора сигнатур методов. Интерфейс может наследовать другие интерфейсы. Например, интерфейс ICollection<t> обязан реализовывать все методы, определенные интерфейсы ICollection<t>,IEnumerable<t>, и IEnumberable.

Определение типа, реализующего интерфейс

Интерфейс System.IComparable<t> определен в Mscorlib.dll так:

public interface IComparable<t> {
Int32 CompareTo( T other);
}

Приведенный ниже код показывает, как определить тип, реализующий этот интерфейс, а также показывает код, сравнивающий два объекта Point(точка):

using System;

// Point унаследован от System.Object и реализует IComparable<t>.
public sealed class Point : IComparable<point> {
   private Int32 m_x, m_y;

   public Point(Int32 x, Int32 y) {
      m_x = x;
      m_y = y;
   }

   // Этот метод реализует IComparable<t> для Point
    public Int32 CompareTo(Point other) {
      return Math.Sign(Math.Sqrt(m_x * m_x + m_y * m_y)
         - Math.Sqrt(other.m_x * other.m_x + other.m_y * other.m_y));
   }

   public override String ToString() {
      return String.Format("({0}, {1})", m_x, m_y);
   }
}

public static class Program {
   public static void Main() {
      Point[] points = new Point[] {
         new Point(3, 3),
         new Point(1, 2),
      };

      if (points[0].CompareTo(points[1]) > 0) {
         Point tempPoint = points[0];
         points[0] = points[1];
         points[1] = tempPoint;
      }
      Console.WriteLine("Точки от самой близкой к (0, 0) до самой дальней:");
      foreach (Point p in points)
         Console.WriteLine(p);
   }
}

Вывод

Точки от самой близкой к (0, 0) до самой дальней:
(1, 2)
(3, 3)