Пока я не получу лучший вариант, это самый «загрузочный» ответ, который я могу выработать:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/ 6cbrjrt5 /
Я перешел на использование LESS и включение пакета NuGet Bootstrap Source для обеспечения совместимости (предоставив мне доступ к файлу начальной загрузки variables.less
:
в _layout.cshtml master page
body-content
navbar-fixed-bottom
в нижнем колонтитуле
перед нижним колонтитулом (как сейчас избыточно) Соответствующая страница HTML:
@RenderBody()
В 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, я был бы признателен.
Хорошо, я провел небольшое исследование. Если вы создадите следующую иерархию:
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, вы увидите, что он говорит:
реализует ... Два
реализует ... Один.
Дополнительные интерфейсы показаны, потому что они подразумеваются IList. Если вы реализуете IList, вы также должны реализовать ICollection и IEnumerable.
Я просто догадываюсь, но я думаю, что на самом деле он реализует IList только в коде, но в документации показаны и остальные интерфейсы, чтобы сделать это явным для программиста, использующего класс.
Не принимайте это как ответ.
Я повторяю то, что workmad3 сказал выше.
Реализуя его в ArrayList, становится легко узнать, какие интерфейсы реализует ArrayList вместо того, чтобы перейти к IList, чтобы обнаружить, что он реализует ICollection и IEnumerable.
Это позволяет избежать необходимости возвращаться назад и вперед по цепочке наследования.
РЕДАКТИРОВАТЬ: На базовом уровне интерфейс, реализующий другой интерфейс, не может обеспечить реализацию . Класс, производный (от IList), следовательно, также косвенно реализует ICollection и IEnumerable. Итак, даже если вы напишете свой собственный класс, реализующий IList (и не добавив в объявление ICollection, IEnumerable), вы увидите, что он должен будет предоставить реализацию для ICollection и IEnumerable.
И рассуждения workmad3 имеют смысл.
Из MSDN ....
Если класс реализует два интерфейса которые содержат член с таким же подпись, затем реализуя это член в классе вызовет оба интерфейсы для использования этого члена в качестве своего реализация.
Также используется явная реализация для решения случаев, когда два интерфейса каждый объявляет разных членов такое же имя, как свойство и метод:
Я предполагаю, что 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 #. Я понятия не имею, почему это могло быть.