gpt4 book ai didi

c# - 具有泛型接口(interface)参数的泛型接口(interface)列表

转载 作者:行者123 更新时间:2023-11-30 15:57:35 25 4
gpt4 key购买 nike

我知道有人问过类似的问题,但我没有找到与我所做的足够相似的问题。

假设我有这个:

public interface IData
{
string Data { get; set; }
}
public interface IJob<out T> where T: IData
{
T JobData { get; } // works because no setter

void Run();
}

public class JobAData : IData
{
public string Data { get; set; }
}

public class JobA : IJob<JobAData>
{
public JobAData JobData { get; private set; } // implements IJob's get plus a set

public JobA(JobAData data)
{
JobData = data;
}

public void Run()
{
//can use JobData nicely here
}
}

而且,由于 out 参数,这也有效:

List<IJob<IData>> jobs = new List<IJob<IData>>();
jobs.Add(new JobA(new JobAData()));

//in another class, extremely simplified (actually running with Quartz)
foreach (var job in jobs)
{
job.Run();
}

虽然这工作正常,但感觉就像一个 hack,因为我必须记住 JobA需要接口(interface)未强制执行的 setter 。
我最初使用的是双 IJob接口(interface)(一个 IJob 和一个 IJob<T> )但这意味着我必须从 IJob<T> 进行转换至 IJob我不喜欢那样。
有没有更简洁的方法来做到这一点?

最佳答案

更新

我最初的建议是创建一个在构造函数中设置数据的抽象类,

public abstract class JobBase<T> : IJob<T> where T : IData {

public JobBase(T data) {
JobData = data;
}

public T JobData { get; private set; }

public abstract void Run();
}

强制派生类设置 JobData 属性。

public class JobA : JobBase<JobAData> {
public JobA(JobAData data) : base(data) { }

public void Run() {
//can use JobData nicely here
}
}

原始答案

遵循抽象基类的想法,考虑一个抽象工厂方法,它会强制任何派生类在属性本身中提供数据

public abstract class JobBase<T> : IJob<T> where T : IData {
public T JobData { get { return GetData(); } }

public abstract void Run();

public abstract T GetData();
}

或者有一个私有(private)的 setter 并在构造函数中设置一次

public abstract class JobBase<T> : IJob<T> where T : IData {

public JobBase() {
JobData = GetData();
}

public T JobData { get; private set; }

public abstract void Run();

public abstract T GetData();
}

任何派生实现都将被迫实现 GetData 方法。

关于c# - 具有泛型接口(interface)参数的泛型接口(interface)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44780070/

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