gpt4 book ai didi

c# - 如何使用通用基类实现服务定位器模式?

转载 作者:太空狗 更新时间:2023-10-30 01:23:27 25 4
gpt4 key购买 nike

我让自己陷入了困境,似乎找不到出路。我正在尝试实现一个简单的 [Service Locator][1],在下面的示例代码中由 GetInstance 方法表示。现在的问题是我在 return 语句中遇到编译器错误:

Cannot implicitly convert type 'Cyberspace.SubClass' to 'Cyberspace.BaseClass<T>'

我已经尝试重写,使 SubClass 本身成为一个通用类,但随后我在 DoSomething 方法的返回语句中遇到编译器错误。

任何人都可以编译此代码,同时保留允许我在 GetInstace 方法中具有抽象返回类型的服务定位器模式原则吗?还是我想在这里实现不可能的事情?

namespace Cyberspace
{
class BaseClass<T>
{
BaseClass<T> GetInstance()
{
return new SubClass();
}
virtual T DoSomething() { return default(T); }
}

class SubClass : BaseClass<OtherClass>
{
public override OtherClass DoSomething()
{
var other = new OtherClass { Description = "Generics are hard"};
return other;
}
}

class OtherClass
{
internal string Description { get; set; }
}
}

尝试 2:

namespace Cyberspace
{
class BaseClass<T>
{
static BaseClass<T> GetInstance() // The "Service Locator" method
{
return new SubClass<T>();
}
internal virtual T DoSomething() { return default(T); }
}

class SubClass<T> : BaseClass<T> where T: OtherClass
{
internal override T DoSomething()
{
var other = new OtherClass { Description = "Generics are hard"};
return (T) other;
}
}

class OtherClass
{
internal string Description { get; set; }
}
}

这会在 return new SubClass<T>(); 行产生以下错误

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Cyberspace.SubClass<T>'. There is no boxing conversion or type parameter conversion from 'T' to 'Cyberspace.OtherClass'

最佳答案

我不清楚你到底想做什么,但我可以告诉你为什么会出现编译错误。

此方法返回的任何内容:

BaseClass<T> GetInstance()

必须能够处理任何类型 T (因为你没有类型约束)。 SubClass只能处理一种类型,不能处理所有类型。因此您不能返回。

关于c# - 如何使用通用基类实现服务定位器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11245907/

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