c# - 抽象工厂模式而不是泛型——怎么样?

标签 c# generics polymorphism factory-pattern

我有一个通用接口(interface):

public interface IReader<T> where T: Result
{
   IEnumerable<T> ReadResults();
}

其中 Result 是一个基类,被扩展为 DetailedResult:

public class Result
{
    // ...
}

public class DetailedResult : Result
{
    // ... ...
}

现在我有两个具体类型的 IReader,每个实现返回不同的类型,特定于阅读器类型:

public class DefaultResultReader<Result> : IReader<Result>
{
    IEnumerable<Result> ReadResults();
}

public class DetailedResultReader<DetailedResult> : IReader<DetailedResult>
{
    IEnumerable<DetailedResult> ReadResults();
}

上面给出的结构使用了泛型。如果可能的话,我想摆脱它,并有某种工厂可以为我创建 IReader 的具体实现 - DefaultResultReader.ReadResults() 方法必须返回 ResultDetailedResultReader.ReadResults() 必须返回 DetailedResult

我的问题是抽象工厂应该如何寻找这个结构 - 如何设计它以便我可以根据要求创建特定的 IReader 对象?

最佳答案

我没有得到你想要的,但我猜你期待以下内容:

public interface IReader<T> where T : Result
{
    IEnumerable<T> ReadResults();
}

public class Result
{
}

public class DetailedResult : Result
{
    // ... ...
}

public class DefaultResultReader : IReader<Result>
{
    public IEnumerable<Result> ReadResults()
    {
        return null;
    }
}

public class DetailedResultReader : IReader<DetailedResult>
{
    public IEnumerable<DetailedResult> ReadResults()
    {
        return null;
    }
}

public abstract class ResultReaderAbsractFactory
{
    public abstract IReader<Result> CreareDefaultResultReader();
    public abstract IReader<DetailedResult> CreareDetailedResultReader();
}

public class ConcreteResultRaderFactory : ResultReaderAbsractFactory
{
    public override IReader<Result> CreareDefaultResultReader()
    {
        return new DefaultResultReader();
    }

    public override IReader<DetailedResult> CreareDetailedResultReader()
    {
        return new DetailedResultReader();
    }
}

关于c# - 抽象工厂模式而不是泛型——怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46234686/

相关文章:

c# - OpenQA.Selenium.WebDriverException : unknown error: Chrome failed to start: exited abnormally while executing tests through Selenium start on linux

c# - 是否创建了 Controller 类实例并在 ASP.NET Framework 中的每个请求中调用了相应的实例方法?

c# - 检查字符串是否包含一个单词,然后检查它是否以该单词开头,如果不包含?

Swift 通用函数调用通用函数

java - 泛型 -> 多态性 -> 误解或它是如何工作的

c# - Xamarin : @(Content) build action is not supported

java - 泛型相关问题

java - 对象创建语法的区别

javascript - 调用基础原型(prototype)函数

c++ - 派生模板类