【问题标题】:Derive from IconElement in UWP从 UWP 中的 IconElement 派生
【发布时间】:2016-05-03 17:42:30
【问题描述】:

我正在尝试将 FontAwesome 引入 UWP,并找到了 SymbolIcon-Class,它为内置的 Segoe UI Symbol 字体执行此操作。

该类继承自 IconElement,看起来很有前途,但我不能从该类派生,因为 VS 告诉我“IconElement 不采用带 0 个参数的构造函数”。

问题:我不知道应该实施什么,VS 或 Resharper 都没有给我任何见解。即使是对 SymbolIcon 的反编译也没有启发我。

我错过了什么?

编辑:

base() 只是一个测试,看看 IconElements 构造函数上是否有任何参数。

但我仍然不明白为什么我不能简单地从 IconElement 派生 - 它在 FrameworkElement 中没有任何问题:

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

    IconElement 没有任何public(或protected)构造函数。派生类需要调用基构造函数,因此不能创建派生类。另一方面,FrameworkElement 有一个默认的无参数 protected 构造函数,您可以从派生类中调用它,因此您可以创建派生类。

    为了使SymbolIcon 类能够从IconElement 类派生,它仍然需要IconElement 类中的可访问构造函数。显然,IconElement 类中有一个 internal 构造函数可以访问,因为它在同一个程序集中。

    您可以自己重新创建相同的场景。创建一个只有一个无参数构造函数 internal 的类。

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

    您现在可以在同一个程序集中创建派生类(它将能够调用此内部构造函数),但您将无法从另一个引用该程序集的程序集中执行此操作(将没有可访问的构造函数)基类)。

    我不确定您究竟为什么要从 IconElement 类派生,但您将无法做到。甚至它实现的IIconElement接口也是内部的,所以你也无法自己实现。

    此外,所有这些类都是本机实现的,因此您无法真正反编译它们。 *.winmd 文件中只有托管元数据可用,如果您尝试反编译某个类,例如锐化器。

    【讨论】:

    • 谢谢!现在完全有道理。对于我的实际问题,我发现另一个似乎适合我的用例的类:FontIcon
    【解决方案2】:

    我认为:

    public foo() : base()
    {
    
    }
    

    不被接受,因为 IconElement 类没有显式构造函数,所以调用 : base() 只是多余的,因为 Resharper 提示:

    为什么它是多余的?因为你甚至不能从那个“IconElement”类继承,为什么?因为:

    如果一个类不包含实例构造函数声明,则默认 实例构造函数是自动提供的。该默认值 构造函数只是调用直接的无参数构造函数 基类。

    更新:

    所以问题是,当编译器去调用直接基类的无参数构造函数(在本例中为“IconElement”)时,它根本找不到任何无参数构造函数(IconElement 没有,编译器给它一个默认值,它调用它的父级,FrameworkElement's),因此它生成CS1729 Error

    【讨论】:

    • 我更新了我的问题 - base() 只是一个测试。但是 IconElement 有什么特别之处,我不能简单地从中得出。它可以从 FrameworkElement 正常工作。
    • @RobertMuehsig :是的,它可以从 FrameworkElement 正常工作,因为 FrameworkElement 有一个已定义的无参数构造函数,派生自它的类可以访问该构造函数(因为它受到保护)
    • 我错过了 IconElement 有一个内部 ctor 的观点。感谢您的帮助!
    • @RobertMuehsig:欢迎
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多