HD86_ Ответов: 1

Являются ли интерфейсы просто способом пометить классы как имеющие общую функциональность?


Я новичок в программировании. Я видел некоторые прошлые вопросы о назначении интерфейсов. Ответы, которые я видел, в целом делятся на два типа:

1. Некоторые ответы просто объяснят, что такое интерфейс.
2. в других ответах будет сказано, что интерфейс позволяет наследовать от нескольких классов или наследовать по структуре, а не по классу.

Насколько я понимаю, реализация интерфейса на самом деле ничего не наследует от интерфейса, потому что вам приходится писать с нуля все, что вы якобы наследуете от интерфейса. Поскольку интерфейс имеет только подписи, у него действительно нет ничего, что вы можете унаследовать, кроме названия.

Поскольку (насколько я знаю) вы наследуете только имя интерфейса, но ничего больше, возможно, реальная ценность интерфейса заключается в том, что он может пометить группу классов как имеющих некоторую общую функциональность?

Примечание: Я уже задавал этот вопрос в "Stackoverflow", но получал только насмешливые и нецивилизованные ответы от людей, которые, вероятно, не понимали этого вопроса. Пожалуйста, будьте лучше и воздержитесь от нецивилизованных выражений, даже если вы не уважаете вопрос. Мое величайшее уважение всем порядочным людям здесь.

Что я уже пробовал:

Интерфейсы C#, такие как ICommand и INotifyPropertyChanged.

[no name]

Думайте об этом как о интерфейсе = контракте. Зная, что класс реализует определенный интерфейс, вы знаете, что класс должен обладать определенной функциональностью. Например, если у вас есть класс, реализующий IDisposable, вы знаете, что у этого класса есть механизм для удаления неуправляемых ресурсов, о которых он знает.

HD86_

Спасибо. То, что вы говорите, имеет для меня смысл.

HD86_

Комментарий NotPolicallyCorrect полностью отвечает на мой вопрос. Меня не интересуют объяснения того, как работает интерфейс. Я только хочу знать причину, по которой мы его используем.

1 Ответов

Рейтинг:
7

Garth J Lancaster

Комментарий NotPolicallyCorrect верен - самое трудное заключается в том, что все "грокуют" эти вещи по - разному, и поэтому, в частности, как и все, чтобы использовать "правильный язык/термины" - мне потребовалась целая вечность, чтобы грокнуть "x => x % 2 == 0", например, потому что на том этапе это был не совсем релевантный пример для меня

- Я думаю, что там, откуда вы пришли в своей голове, "иметь какую-то общую функциональность" - это нормально, и эта общая функциональность - это "контракт".

Вы сказали, что пробовали "интерфейсы C#, такие как ICommand и INotifyPropertyChanged". - э-э, хорошо, они могли бы быть немного сложными для начала - я бы сам с трудом начал с чего-то "более простого" :-)

Рискуя не сделать всю хорошую работу до сих пор, я приведу этот пример

// Interface 

public interface ILogger
{
    public void Log(string msg);
}

// 'Concrete' classes 

public class FileLogger : ILogger
{
      // TODO : Implement Log method to File, Possibly File Spec From Ctor
}

public class TextBoxLogger : ILogger
{
      // TODO : Implement Log method to TextBox, Possibly TextBox Name From Ctor
}

public class DatabaseLogger : ILogger
{
      // TODO : Implement Log method to Database, Possibly Database Connection From Ctor
}


Итак, у вас есть интерфейс ILogger, который говорит, что любой класс, реализующий me, должен реализовать Log (string msg); потому что это "контракт", указанный определением интерфейса

. независимо от того, используете ли вы FileLogger, TextBoxLogger, DatabaseLogger, как только у вас есть экземпляр этих объектов, вы всегда вызываете только Log ("some message");

может быть, это поможет


HD86_

Спасибо, Гарт. Ваш пример не может "отменить хорошую работу", потому что это очень простой пример, и я уже работал с более сложными примерами, когда создавал приложение WPF. Я полностью понимаю, что такое интерфейс и как он работает, но я только пытаюсь понять причину, по которой мы их используем.

Garth J Lancaster

хорошо, почему в приведенном мной примере мой вызывающий код всегда идет только SomeLogger. Log ("какое-то сообщение"); не нужно выяснять, какой регистратор мы используем и какой эквивалентный метод журнала находится в этом классе

HD86_

Спасибо. Этот комментарий отвечает на мой вопрос.