gpt4 book ai didi

C#:将子类实例分配给抽象类实现的接口(interface)

转载 作者:太空狗 更新时间:2023-10-30 00:38:51 25 4
gpt4 key购买 nike

public interface IParser<T> where T: new()
{
IList<T> Parse();
}

上面的接口(interface)是通过下面的抽象类实现的

public abstract class BaseParser<T>: IParser<T> where T : new()
{
protected abstract string Sql { get;}
public List<T> Parse()
{
// do parsing
Console.WriteLine(Sql);
}
}

下面是上述抽象类的两个具体实现

public class EMailParser: BaseParser<Email>
{
protected override string Sql
{
get
{
return @"SELECT * FROM emails";
}
}
}

public class UrlParser : BaseParser<Url>
{
protected override string Sql
{
get
{
return @"SELECT * From Url";
}
}
}

用法:

class Program
{
static void Main(string[] args)
{
if(args[1] == "url")
Parser<Url>();
else
Parser<Email>();
}
static void Parse<T>()
{
// Create instance based on typof T and then assign to implementaion
IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser(): new EmailParser();
parser.Parse();
}
}

我想创建 EmailParser 的实例或 UrlParser基于 Program.Main 中提供的通用类型方法并将其分配给 BaseParser 实现的接口(interface)(抽象类)。我怎样才能做到这一点?我知道我可以通过修改 Program.Parse<T> 来解决这个问题如下

static void Parse<T>() where T: new()
{
IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser() as BaseParser<T> : new EmailParser() as BaseParser<T>;
parser.Parse();
}

但是我想知道为什么我不能将子类实例分配给抽象类实现的接口(interface)??

我不明白为什么下一行不起作用

IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser(): new EmailParser();

为什么这条线有效

IParser<T> parser = typeof(T) == typeof(Url) ? new UrlParser() as BaseParser<T> : new EmailParser() as BaseParser<T>;

根据@nawfal 的回答,这一行也不应该工作,因为 BaseParser 和 BaseParser 是不同的类型。是否存在来自 BaseParser 的 IParser 的隐式大小写?

最佳答案

我认为问题在于编译器没有考虑您要将结果分配给的类型 ?: 解析条件时有条件。相反,?: 是单独解析的,因此编译器无法确定要使用哪种类型。

编辑:来自 C# 5.0 规范的第 7.14 节:

The second and third operands, x and y, of the ?: operator control the type of the conditional expression. If x has type X and y has type Y then:

  • If an implicit conversion (§6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.

  • If an implicit conversion (§6.1) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.

  • Otherwise, no expression type can be determined, and a compile-time error occurs.

关于C#:将子类实例分配给抽象类实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37774023/

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