Это ошибка в Firefox, Edge и IE11.
С flex-direction: column-reverse
полоса прокрутки появляется только в Chrome.
Если вы переключитесь на column
, полоса прокрутки Работает во всех браузерах.
Дополнительная информация:
Это действительно похоже на ситуацию для хорошей полиморфной реализации. При переопределении соответствующих методов в производных классах Вам, возможно, не понадобятся регистрации цикла вообще.
В C# я полагаю, что оператор переключения только работает с целыми числами и строками.
В то время как не возможно использовать оператор переключения для проверки типов, не невозможно уменьшить проблему до более управляемой кодовой базы.
В зависимости от определенной ситуации и требования я рассмотрел бы.
Используя IDictionary<Type, T>
для хранения результата в словаре. T мог самостоятельно быть делегатом, к которому можно обратиться. Это будет работать, если Вы не должны будете волноваться о наследовании - то питание для наследования возьмет немного больше работы.
Используя имя типа класса (который является строкой) в операторе переключения. Это использует switch (b.GetType().Name)
и нет никакой опции для глубокой структуры наследования.
Едва ли переключатели соответствуют переменной (строка или интервал (или перечисление)) с константным выражением как оператор переключения.
http://msdn.microsoft.com/en-us/library/06tc147t (По сравнению с 71) .aspx
Вы могли добавить метод getType()
к BaseType
, который реализован каждым конкретным подклассом, чтобы возвратить уникальный интегральный идентификатор (возможно перечисление) и включить это, да?
В C# не возможно использовать "," ключевое слово как часть оператора переключения. Все маркировки случая в переключателе должны оценить к константным выражениям. не конвертируемо к константному выражению.
я определенно чувствую боль хотя когда дело доходит до включения типов. Поскольку действительно решение, Вы обрисовали в общих чертах работы, но это - conveluted способ сказать для x, делает y и b. Это было бы намного больше natular, чтобы записать, что это больше как следующий
TypeSwitch.Do(
sender,
TypeSwitch.Case<Button>(() => textBox1.Text = "Hit a Button"),
TypeSwitch.Case<CheckBox>(x => textBox1.Text = "Checkbox is " + x.Checked),
TypeSwitch.Default(() => textBox1.Text = "Not sure what is hovered over"));
Вот является сообщением в блоге, которое я записал о том, как достигнуть этой функциональности.
http://blogs.msdn.com/jaredpar/archive/2008/05/16/switching-on-types.aspx
Существует другая вещь думать о помимо способа, которым компилятор обрабатывает switch
операторы, и это - функционирование is
оператор. Существует большая разница между:
if (obj is Foo)
и
if (obj.GetType() == typeof(Foo))
Несмотря на имя, is
оператор говорит Вам, если объект совместим с данным типом, не, если это из данного типа. Это приводит к не полностью очевидным ошибкам (хотя это довольно очевидное), которые похожи:
if (obj is System.Object)
{
//this will always execute
}
else if (obj is Foo)
{
//this will never execute
}
Многие предложения здесь указывают на Вас в направлении использования типа объекта. Это прекрасно, если то, что Вы действительно хотите, является логикой, связанной с каждым типом. Но если это так, идите тщательно при использовании is
оператор.
Также: хотя Вы не можете изменить эти базовые типы, который не означает, что Вы не можете использовать предложение Owen. Вы могли реализовать дополнительные методы:
public enum MyType { Foo, Bar, Baz };
public static class MyTypeExtension
{
public static MyType GetMyType(this Foo o)
{
return MyType.Foo;
}
public static MyType GetMyType(this Bar o)
{
return MyType.Bar;
}
public static MyType GetMyType(this Baz o)
{
return MyType.Baz;
}
}
Затем Вы можете использовать switch
оператор:
switch (myObject.GetType())
{
case MyType.Foo:
// etc.
Случаи типа и объектно-ориентированный код, кажется, не входят в это хорошо вместе, по моему опыту. Подход, который я предпочитаю в этой ситуации, двойной шаблон отправки . Короче говоря:
танец перестановки аргумента устраняет сужение, брошенное путем сворачивания его в вызов для Диспетчеризации - получатель знает свой точный тип и передает его путем призывания обратно точной перегрузки Процесса для его типа. Это - также большая победа производительности в реализациях, таких как.NET Компактная Платформа, в которой сужающиеся броски являются чрезвычайно медленными, но виртуальная отправка быстра.
результат будет чем-то вроде этого:
public class Listener
{
public virtual void Process(Base obj) { }
public virtual void Process(Derived obj) { }
public virtual void Process(OtherDerived obj) { }
}
public class Base
{
public virtual void Dispatch(Listener l) { l.Process(this); }
}
public class Derived
{
public override void Dispatch(Listener l) { l.Process(this); }
}
public class OtherDerived
{
public override void Dispatch(Listener l) { l.Process(this); }
}
public class ExampleListener
{
public override void Process(Derived obj)
{
Console.WriteLine("I got a Derived");
}
public override void Process(OtherDerived obj)
{
Console.WriteLine("I got an OtherDerived");
}
public void ProcessCollection(IEnumerable collection)
{
foreach (Base obj in collection) obj.Dispatch(this);
}
}