Что является основой всех интерфейсов в .net, так же как база для всех классов является объектом - PullRequest
3 голосов
/ 06 августа 2010

Я хотел бы передать интерфейс к сигнатуре метода, которая принимает Object в качестве параметра, поэтому мне интересно об этом вопросе

public Stream GetViewStream(string viewName, object model, ControllerContext context)
  1. вместо объекта, который я хотел бы передатьИнтерфейс Imodel, без изменения подписи.Есть ли базовый класс для интерфейсов?

  2. Также в новом mvc2 есть способ вообще избежать контекста контроллера?

Ответы [ 4 ]

3 голосов
/ 06 августа 2010

Я бы ответил только на первый вопрос - почему нет общего базового интерфейса для всех интерфейсов?

Прежде всего, нет общего предварительно определенного базового интерфейса для всех интерфейсов, в отличие от случая System.Object.,Объяснение этого может быть очень интересным.

Предположим, вы могли бы иметь общий интерфейс для всех интерфейсов в системе.Это означает, что все интерфейсы должны будут заставить свои реализации предоставлять подробности реализации для этого общего базового интерфейса.В целом, интерфейс используется для придания особого поведения их конкретным классам реализации.Очевидно, что вы хотите определить интерфейс, только когда знаете, что делать, и не знаете, КАК это сделать.Итак, если вы позволите создать общий базовый интерфейс для всех интерфейсов и заставите реализации ожидать, что они предоставят подробную информацию о том, как это сделать - зачем вам это делать?Какую общую задачу должен выполнять каждый класс, который отличается друг от друга?

Давайте посмотрим на другую сторону медали, почему у нас System.object в качестве базового класса любого типа .Net - он прост, он дает вамнекоторые методы, которые имеют ОБЩУЮ реализацию для любого типа .Net и для тех методов, которые могут отличаться от типа к типу, сделали его виртуальным, например: .ToString ()

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

Одна из распространенных практик использования интерфейса - это определение определенного поведения для любого типа.Как будто бы у меня был интерфейс IFlyable, который предоставит Fly () всем типам, которые реализуют IFlyable.Таким образом, я могу играть с любым Flyable-объектом независимо от его иерархии наследования.Я могу написать такой метод ..

public void FlyTheObject(IFlyable flyingObject)
{ 
    flyginObject.Fly();
}

Он не требует от объекта ничего, кроме реализации метода Fly ().

EDIT

Дополнительно, Все интерфейсы будут преобразованы в Object, потому что интерфейсы не могут быть созданы.Объект всегда имеет конкретный класс, который может быть создан.Этот класс может реализовывать или не реализовывать ваш интерфейс, но, как мы знаем, любой тип .Net в конечном итоге основан на System.Object, поэтому вы сможете перенести экземпляр в тип объекта независимо от того, реализует ли он конкретный интерфейс илинет.

0 голосов
/ 06 августа 2010

Базового класса для интерфейсов не существует, но вы можете передать любую переменную интерфейса, например:

 private IEnumerable<int> myInterfaceVariable = new List<int>();

, в ваш метод, поскольку по определению все, что хранится в этой переменной, должно быть экземпляром класса, которыйнаследует от интерфейса - следовательно, это должен быть объект.

Следующее компилируется нормально:

public class InterfaceAsObject
{
    private IEnumerable<int> myInterfaceVariable = new List<int>();

    private void CallDoSomething()
    {
        DoSomething(myInterfaceVariable);
    }

    private void DoSomething(object input)
    {


    }
}
0 голосов
/ 06 августа 2010

Re 1, там - это без базового интерфейса, но если я вас правильно понимаю, вы можете достичь того, что, я думаю, вы хотите, просто передав свой объект, реализующий IModel, через параметр модели и приведите ( и проверь!) параметр для IModel. Я использую «как» и проверяю на ноль.

Если вам не нужна полная гибкость, лучший способ сделать это - определить интерфейс, который должен поддерживать параметр модели. Если определенные объекты поддерживают производные интерфейсы (например, IDerivedModel : IModel), это тоже будет работать.

Найдите учебник по полиморфизму.

0 голосов
/ 06 августа 2010

Нет, базовый класс для интерфейсов отсутствует.Также нет базового интерфейса для интерфейсов.

Что касается вашего второго вопроса (и частично первого) - что вы на самом деле пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...