Почему классы наборов в C# (как ArrayList) наследовались нескольким интерфейсам, если один из этих интерфейсов наследовался остающемуся?

Пока я не получу лучший вариант, это самый «загрузочный» ответ, который я могу выработать:

JSFiddle: http://jsfiddle.net/TrueBlueAussie/ 6cbrjrt5 /

Я перешел на использование LESS и включение пакета NuGet Bootstrap Source для обеспечения совместимости (предоставив мне доступ к файлу начальной загрузки variables.less:

в _layout.cshtml master page

  • Переместите нижний колонтитул за пределы контейнера body-content
  • Используйте Boostrap navbar-fixed-bottom в нижнем колонтитуле
  • Удалите
    перед нижним колонтитулом (как сейчас избыточно)

Соответствующая страница HTML:

@RenderBody()

© @DateTime.Now.Year - My ASP.NET Application

В Site.less

  • Установите значения HTML и BODY на 100%
  • Установите BODY overflow на hidden
  • Установите body-content div position на absolute
  • Установите для body-content div top значение @navbar-height вместо значения жесткого подключения
  • Установите для body-content div bottom значение 30px.
  • ] Установите body-content div left и right в 0
  • . Установите body-content div [1124. ] до auto

Site.less

html {
    height: 100%;

    body {
        height: 100%;
        overflow: hidden;

        .container-fluid.body-content {
            position: absolute;
            top: @navbar-height;
            bottom: 30px;
            right: 0;
            left: 0;
            overflow-y: auto;
        }
    }
}

Остается проблема, по-видимому, нет определяющей переменной для footer height в начальной загрузке. Если кто-то позвонит, скажите мне, есть ли волшебная переменная 30px, определенная в Bootstrap, я был бы признателен.

31
задан thecoop 24 September 2009 в 22:14
поделиться

6 ответов

Хорошо, я провел небольшое исследование. Если вы создадите следующую иерархию:

  public interface One
    {
        void DoIt();
    }

    public interface Two : One
    {
        void DoItMore();
    }

    public class Magic : Two
    { 
        public void DoItMore()
        {
            throw new NotImplementedException();
        }

        public void DoIt()
        {
            throw new NotImplementedException();
        }
    }

И скомпилируете ее, затем создадите ссылку на DLL в другом решении, введите Magic и нажмите F12, вы получите следующее:

 public class Magic : Two, One
    {
        public Magic();

        public void DoIt();
        public void DoItMore();
    }

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

Обновление: если вы откроете DLL в ILDASM, вы увидите, что он говорит:

реализует ... Два

реализует ... Один.

14
ответ дан 27 November 2019 в 22:49
поделиться

Дополнительные интерфейсы показаны, потому что они подразумеваются IList. Если вы реализуете IList, вы также должны реализовать ICollection и IEnumerable.

3
ответ дан 27 November 2019 в 22:49
поделиться

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

2
ответ дан 27 November 2019 в 22:49
поделиться

Не принимайте это как ответ.

Я повторяю то, что workmad3 сказал выше.

Реализуя его в ArrayList, становится легко узнать, какие интерфейсы реализует ArrayList вместо того, чтобы перейти к IList, чтобы обнаружить, что он реализует ICollection и IEnumerable.

Это позволяет избежать необходимости возвращаться назад и вперед по цепочке наследования.

РЕДАКТИРОВАТЬ: На базовом уровне интерфейс, реализующий другой интерфейс, не может обеспечить реализацию . Класс, производный (от IList), следовательно, также косвенно реализует ICollection и IEnumerable. Итак, даже если вы напишете свой собственный класс, реализующий IList (и не добавив в объявление ICollection, IEnumerable), вы увидите, что он должен будет предоставить реализацию для ICollection и IEnumerable.

И рассуждения workmad3 имеют смысл.

0
ответ дан 27 November 2019 в 22:49
поделиться

Из MSDN ....

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

Также используется явная реализация для решения случаев, когда два интерфейса каждый объявляет разных членов такое же имя, как свойство и метод:

1
ответ дан 27 November 2019 в 22:49
поделиться

Я предполагаю, что CLR не поддерживает интерфейс, наследуемый от другого интерфейса.

C #, однако, поддерживает эту конструкцию, но для совместимости с CLR ему необходимо «сгладить» дерево наследования.

[Edit]

После получения рекомендаций снизу быстро настройте проект VB.Net:

Public Interface IOne
    Sub DoIt()
End Interface

Public Interface ITwo
    Inherits IOne
    Sub DoIt2()
End Interface

Public Class Class1
    Implements ITwo

    Public Sub DoIt() Implements IOne.DoIt
        Throw New NotImplementedException()
    End Sub

    Public Sub DoIt2() Implements ITwo.DoIt2
        Throw New NotImplementedException()
    End Sub
End Class

Результаты компиляции в следующем (C #):

public class Class1 : ITwo
{
    public Class1();
    public void DoIt();
    public void DoIt2();
}

Это показывает, что VB.Net делает НЕ сглаживает иерархию интерфейса в отличие от C #. Я понятия не имею, почему это могло быть.

0
ответ дан 27 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: