gpt4 book ai didi

c# - 为什么这个派生类的行为不同于它的基类

转载 作者:太空狗 更新时间:2023-10-29 20:14:39 25 4
gpt4 key购买 nike

以某种晦涩的方式,不添加新功能(但)的派生类的行为与其基类不同。派生类:

public class MyCheckButton : CheckButton
{
public MyCheckButton(string label) : base(label)
{
}
}

MyCheckButton 继承自(GTK#,Mono 项目的一部分)CheckButton。但是在以下代码片段中,它们的行为有所不同:

var button1 = new CheckButton("_foo");
var button2 = new MyCheckButton("_foo");
// code omitted

标签中的下划线确保标签获得助记符。对于 button1 这在我的测试代码中有效:我在 f 带下划线的地方得到“foo”。但是对于 button2 这失败了。我只是在我的对话框中得到“_foo”作为标签。

谁能解释一下这个例子中派生类的行为有何不同,或者屏幕背后是否有一些魔法可以检查实际类的类型?

最佳答案

[I]s there some magic going on behind the screen that maybe checks the type of the actual class?

实际上,有:

public CheckButton(string label) : base(IntPtr.Zero)
{
if (base.GetType() != typeof(CheckButton))
{
ArrayList arrayList = new ArrayList();
ArrayList arrayList2 = new ArrayList();
arrayList2.Add("label");
arrayList.Add(new Value(label));
this.CreateNativeObject((string[])arrayList2.ToArray(typeof(string)), (Value[])arrayList.ToArray(typeof(Value)));
}
else
{
IntPtr intPtr = Marshaller.StringToPtrGStrdup(label);
this.Raw = CheckButton.gtk_check_button_new_with_mnemonic(intPtr);
Marshaller.Free(intPtr);
}
}

看起来您的子类将走以前的路线。不过,不确定为什么会弄乱助记符;后一种方法是对 native gtk 库的 P/Invoke。将 label 包装在 Value 对象中可能会弄乱助记符。

让它成为一个教训(给 GTK# 设计者):不要违反 Liskov Substitution Principle .令人困惑!

关于c# - 为什么这个派生类的行为不同于它的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com