Производный от 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.