PECS (производитель extends
и потребитель super
)
Мнемоника → принцип Get и Put.
Этот принцип гласит, что:
В Java параметры и параметры типового типа не поддерживают наследование следующим образом.
class Super {
void testCoVariance(Object parameter){} // method Consumes the Object
Object testContraVariance(){ return null;} //method Produces the Object
}
class Sub extends Super {
@Override
void testCoVariance(String parameter){} //doesn't support eventhough String is subtype of Object
@Override
String testContraVariance(){ return null;} //compiles successfully i.e. return type is don't care
}
Принцип подстановки Лискова: Массивы являются ковариантными (небезопасными), но Generics не являются, то есть инвариантными (безопасными). Принцип подстановки не работает с параметризованными типами, что означает, что это незаконно писать. Ковариант просто означает, что X
является подтипом Y
, тогда X[]
также будет подтипом Y[]
.
Object name= new String("prem"); //works
List numbers = new ArrayList();//gets compile time error
Integer[] myInts = {1,2,3,4};
Number[] myNumber = myInts;
myNumber[0] = 3.14; //attempt of heap pollution i.e. at runtime gets java.lang.ArrayStoreException: java.lang.Double(we can fool compiler but not run-time)
List list=new ArrayList<>();
list.add("prem");
List
ограниченный (т. е. заголовок к чему-либо) подстановочный знак: Есть 3 разных варианта подстановочных знаков:
?
или ? extends Object
- неограниченный подстановочный знак. Он обозначает семью всех типов. Использовать, когда вы оба получаете и ставите. ? extends T
(семейство всех типов, которые являются подтипами T
) - подстановочный знак с верхней границей. T
является самым верхним классом в иерархии наследования. Используйте подстановочный знак extends
, когда вы получаете только значения из структуры. ? super T
(семейство всех типов, которые являются супертипами T
) - подстановочный знак с нижней границей. T
является самым низким классом в иерархии наследования. Используйте подстановочный символ super
, если вы только поместите значения в структуру. Примечание: подстановочный знак ?
означает ноль или один раз, представляет неизвестный тип. Подстановочный знак может использоваться как тип параметра, никогда не используемый в качестве аргумента типа для вызова общего метода, создания экземпляра универсального класса (т. Е. При использовании подстановочного знака, эта ссылка не используется в другом месте программы, как мы используем T
).
class Shape { void draw() {}}
class Circle extends Shape {void draw() {}}
class Square extends Shape {void draw() {}}
class Rectangle extends Shape {void draw() {}}
public class TestContraVariance {
/*
* Example for an upper bound wildcard (Get values i.e Producer `extends`)
*
* */
public void testCoVariance(List extends Shape> list) {
list.add(new Shape()); // Error: is not applicable for the arguments (Shape) i.e. inheritance is not supporting
list.add(new Circle()); // Error: is not applicable for the arguments (Circle) i.e. inheritance is not supporting
list.add(new Square()); // Error: is not applicable for the arguments (Square) i.e. inheritance is not supporting
list.add(new Rectangle()); // Error: is not applicable for the arguments (Rectangle) i.e. inheritance is not supporting
Shape shape= list.get(0);//compiles so list act as produces only
/*You can't add a Shape,Circle,Square,Rectangle to a List extends Shape>
* You can get an object and know that it will be an Shape
*/
}
/*
* Example for a lower bound wildcard (Put values i.e Consumer`super`)
* */
public void testContraVariance(List super Shape> list) {
list.add(new Shape());//compiles i.e. inheritance is supporting
list.add(new Circle());//compiles i.e. inheritance is supporting
list.add(new Square());//compiles i.e. inheritance is supporting
list.add(new Rectangle());//compiles i.e. inheritance is supporting
Shape shape= list.get(0); // Error: Type mismatch, so list acts only as consumer
Object object= list.get(0); // gets an object, but we don't know what kind of Object it is.
/*You can add a Shape,Circle,Square,Rectangle to a List extends Shape>
* You can't get an Shape(but can get Object) and don't know what kind of Shape it is.
*/
}
}
Microsoft обеспечивает удобный инструмент под названием "Перфоратор", который может сказать Вам, которыми части Вашего приложения WPF представляются в программном обеспечении. Это - часть большего набора "Производительности Профильные Инструменты", которые можно найти здесь .
Я использую следующие инструменты для разработки WPF:
Кроме того, для Отслеживания, Родинка и VS2K8 - использование:
я нахожусь в Смешении, по крайней мере, так же как Visual Studio, когда я работаю над UI в проектах WPF. Я использую Смешение для создания начальных версий UI, и затем я настрою xaml вручную в VS. Я использую Kaxaml для "испытания вещей". Если я захочу экспериментировать, и я не хочу издержки создания нового проекта в VS или Смешении, я буду использовать Kaxaml вместо этого.
Экспорт Xaml . Векторы экспорта (как те сделанные в Adobe Illustrator) к xaml.
Бесполезные утилиты XAML другой дополнительный автор формы VS Родинки, Karl Shifflett. Генерирует формы, listviews, сетки, базирующиеся на метаданных класса. Также некоторые полезные приемы xaml: группировка элементов в панели, очистка разработчика генерировала код, и т.д.
Я использую ReaderSvg для преобразования SVG (векторная графика) в XAML.
И не непосредственно связанный с WPF, но очень полезный, чтобы понять, как WPF управляет работой: Отражатель .
Crack.NET - это инструмент для отладки во время выполнения и создания сценариев, созданный Джошем Смитом, который дает вам доступ к внутренним компонентам любого настольного приложения .NET, работающего на вашем компьютере. Если вам нравится Snoop and Mole для Visual Studio, вам также понравится Crack.NET. Crack.NET позволяет вам «обходить» управляемую кучу другого приложения .NET, проверять всевозможные значения объектов и даже манипулировать этими объектами с помощью скриптов IronPython.
Я использую все инструменты, перечисленные в ответе, поэтому добавлю еще один.
Rooler - Это отличный инструмент для работы с пользовательским интерфейсом, и я считаю, что он реализован в WPF.
Когда я только начинал изучение WPF, я обнаружил множество полезных утилит (перечисленных ниже). В моей статье Essential Tools for the WPF Novice на Simple-Talk.com каждый из них обсуждается с иллюстрациями и ссылками.
Общие инструменты исследования
XamlPad и его преемники
(Моя статья содержит подробную сравнительную таблицу функций для этих шести редакторов.)
Некоторые из отличных статей со списком инструментов для WPF (из моих закладок) -
The Complete List of XAML Tools:
http://www.realsoftwaredevelopment.com/the-complete-list-of-xaml-tools/
Windows Presentation Foundation Tools and Controls:
http://blogs.msdn.com/b/mswanson/archive/2006/02/26/wpftoolsandcontrols.aspx
Еще одна, о которой я знаю -
Pistachio - "WPF Resource Visualizer" :
http://www.granthinkson.com/2007/11/08/announcing-pistachio-wpf-resource-visualizer/