gpt4 book ai didi

c# - 如何访问从泛型类继承的对象?

转载 作者:行者123 更新时间:2023-12-03 19:25:31 24 4
gpt4 key购买 nike

这让我很头疼,我希望有人能够找到解决方案。下面是这种情况的简化代码。这里的目标是,我想要一个单独的、可重用的库,并可以选择为每个实现自定义这些类。所以我去继承了:

namespace Library {

//a class that holds stuff together
public class Core<THandler> where THandler:Handler
{
public THandler handler;
public string text = "Something";
}

//class that react for extern events, say a keyboard events
public class Handler
{
protected object core;
public Handler(object _core) {
core = _core;
}
protected virtual void OnEvent() {
//how to access 'core.text' ??
var a = (Core<Handler>)core; //raises System.InvalidCastException
// since 'core' actualy contains
// an instance of MyCore
}
}
}
namespace MyImplementation {
public class MyCore : Library.Core<MyHandler>
{
}

public class MyHandler : Library.Handler
{
protected override void OnEvent() {
base.OnEvent();
//and what's the preferable option for accessing 'core' here?
var a = (MyCore)core; //I use this
}
}
}

由于 Handler.core 包含一个 MyCore 实例,如何在 Hanlder.OnEventmethod 中访问该对象?

最佳答案

你最好使用接口(interface)来绑定(bind) CoreHandler对彼此。你仍然可以保留 Core<T>通用的。通用类型约束不允许您声明循环依赖关系,否则这对于使您的核心工作是必要的。

请注意,有问题的转换无效的根本原因不是 core实例是 MyCore从你的例子中,但因为 MyCore继承自 Core<MyHandler>而不是 Core<Handler> .

万一出于某种原因,你坚持保持当前的设计,你可以制作Handler同样是泛型,将其祖先作为类型参数传递,并像这样修复转换:

public class Handler<THandler> where THandler : Handler<THandler>
{
protected object core;
public Handler(object _core) {
core = _core;
}
public virtual void OnEvent() {
// this works
var a = (Core<THandler>)core;
}
}

因此,为了使其更加类型安全并避免强制转换,构造函数应如下所示:

    protected Core<THandler> core;
public Handler(Core<THandler> _core) {
core = _core;
}

MyHandler声明很自然地看起来像这样:

public class MyHandler : Handler<MyHandler>
{

}

关于c# - 如何访问从泛型类继承的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792113/

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