Производный от IconElement в UWP

Я пытаюсь перенести FontAwesome в UWP и нашел SymbolIcon -Class, который делает это для встроенного шрифта Segoe UI Symbol.

Класс унаследован от IconElement и выглядит многообещающе, но я не могу наследовать от этого класса, потому что VS говорит мне, что "IconElement не принимает конструктор, который принимает 0 аргументов".

Проблема: я не знаю, что мне следует реализовать, и ни VS, ни Resharper не дали мне никакого понимания. Даже декомпиляция SymbolIcon не просветила меня.

Что мне не хватает?

В.С

Редактировать:

Base() был просто тестом, чтобы увидеть, есть ли какие-либо аргументы в конструкторе IconElements.

Но я все еще не понимаю, почему я не могу просто извлечь из IconElement - он работает без каких-либо проблем с FrameworkElement:

Большой пример

2 ответа

Решение

IconElement не имеет public (или же protected) конструкторы. Производный класс должен вызывать базовый конструктор, поэтому вы не можете создать производный класс. FrameworkElement на другой ханс есть по умолчанию без параметров protected конструктор, который вы можете вызвать из производного класса, поэтому вы можете создать производный класс.

Для SymbolIcon класс, чтобы иметь возможность получить из IconElement класс, ему все еще нужен доступный конструктор в IconElement учебный класс. Очевидно, есть internal конструктор доступен в IconElement класс, к которому он может получить доступ, потому что он находится в той же сборке.

Вы можете воссоздать тот же сценарий самостоятельно. Создайте класс только с одним конструктором без параметров, который internal,

public class BaseClass()
{
    internal BaseClass() { }
}

Теперь вы можете создать производный класс в той же сборке (он сможет вызывать этот внутренний конструктор), но вы не сможете сделать это из другой сборки, ссылающейся на эту (в базовом классе не будет доступных конструкторов),

Я не уверен, почему именно вы хотите извлечь из IconElement класс, но вы не сможете это сделать. Даже IIconElement Интерфейс, который он реализует, является внутренним, так что вы не сможете реализовать его и сами.

Кроме того, все эти классы реализованы изначально, поэтому вы не можете их декомпилировать. В разделе доступны только управляемые метаданные *.winmd файлы, которые вы можете увидеть, если попытаетесь декомпилировать класс, например, в ReSharper.

Я думаю что:

public foo() : base()
{

}

не принято, потому что просто класс IconElement не имеет явного конструктора, поэтому вызов : base() просто избыточно, поскольку Resharper намекает:

введите описание изображения здесь

Почему это избыточно? Потому что вы даже не можете наследовать от этого класса IconElement, почему? так как:

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

Обновить:

Таким образом, проблема заключается в том, что когда компилятор вызывает конструктор без параметров прямого базового класса (в данном случае "IconElement"), он просто не находит конструктор без параметров (у IconElement его нет, компилятор дает по умолчанию один для него, и он вызывает своего родителя, FrameworkElement's), следовательно, он генерирует ошибку CS1729.

Другие вопросы по тегам