Я работаю с C# и .NET в течение некоторого времени и даже несмотря на то, что раньше я работал с языками OOP (точнее, Java), работая над приложениями .NET Я вижу, что интерфейсы использовались намного больше, чем я видел на Java. У меня нет большого опыта, поэтому я не говорю, что интерфейсы больше используются в .NET, но теперь я почувствовал необходимость более глубокого понимания интерфейсов и каковы преимущества, которые заставляют людей использовать их так часто ,Объяснение использования интерфейса (перспектива C#)
У меня есть кое-что в интернете, кое-что здесь, и объяснение, которое имело для меня наибольшее значение, было следующим: How will I know when to create an interface?.
И вот мой вопрос. Я не ожидаю какого-либо магического объяснения интерфейсов вообще, потому что я достаточно читал, чтобы увидеть, что этого не происходит. Я надеюсь, что с опытом и кодированием более глубокое понимание придет само собой, поэтому я решил попробовать пример, обозначенный как преимущество использования интерфейсов из принятого ответа в ссылке. Я также скопирую его здесь:
У вас есть a, b, c, d из 4 разных типов. всего кода у вас есть что-то вроде:
a.Process();
b.Process();
c.Process();
d.Process();
Почему бы не иметь их реализации IProcessable
, а затем сделать
List<IProcessable> list;
foreach(IProcessable p in list)
p.Process();
Этот масштабируется намного лучше, когда вы добавляете, скажем, 50 типов классов, которые все делайте то же самое.
Проблема в том, что, похоже, у меня этого нет. После того, как я прочитал его, я открыл свою Visual Studio 2010 и попытался воссоздать этот пример: я сделал проект и создал четыре класса: a
, b
, c
, d
. Все эти классы одинаковы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class a : ITest
{
public void Test()
{
System.Console.WriteLine("Hi from a");
}
}
}
всего 4 различных имена и метод Test()
печати имени. Вот интерфейс:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
interface ITest
{
public void Test();
}
}
И то, что я понимаю в моем Program.cs
у меня есть это:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
List<ITest> list;
static void Main(string[] args)
{
foreach (ITest p in list)
p.Test();
}
}
}
Хорошо. Кажется, что я действительно ошибался. Я думал, что, реализуя один и тот же интерфейс, я могу автоматически получить список всех классов и использовать их, например, как в моем методе Main()
выше. Однако я получаю следующее сообщение об ошибке:
An object reference is required for the non-static field, method, or property
Ну, кто-то может понизить уровень мне и объяснить мне, с точки зрения этого примера, как я точно принести пользу, как это с помощью интерфейса.
Интерфейсы здесь не проблема - это поле 'list'' Program'. Это должно быть статическое поле, чтобы использовать его из статического метода 'Main'. (Вероятно, вы также захотите добавить некоторые вещи в этот список) – kevingessner
Это будет хорошее чтение - http://stackoverflow.com/q/14482483/218882 –