gpt4 book ai didi

c# - 没有接口(interface)的通用方法是否可以初始化属性?

转载 作者:行者123 更新时间:2023-11-30 20:27:15 29 4
gpt4 key购买 nike

假设有接口(interface)和类。

interface IPen<T> {...}

class PenModelA : IPen<ModelA> {...}
class PenModelAA : IPen<ModelA> {...}
class PenModelB : IPen<ModelB> {...}
class PenModelBA : IPen<ModelB> {...}

如何在没有通用接口(interface)方法的情况下定义属性?泛型方法稍后将在构造函数中定义。一会儿,该属性必须是全局的,我必须有机会在全类使用它。

我想那样做。

class Qwerty
{
public IPen<T> A {get; set;}

public Qwerty()
{
if (...)
{
IPen<ModelA> A;
A = new PenModelA();
}
else
{
IPen<ModelB> A;
A = new PenModelB();
}
}
}

编辑:

有模型A、模型B。

class ModelA
{
public int Z;
}

class ModelB
{
public string Y;
public bool L;
public One L;
}

class One
{
public bool QW;
}

最佳答案

你不能只定义 IPen<T>没有说明那是什么 T是。这给您留下了 2 种可能性。

1) 为T 使用公共(public)基类\接口(interface).例如:

interface IPen<out T> where T : IModel {}
interface IModel {}
class PenModelA : IPen<ModelA> {}
class PenModelB : IPen<ModelB> {}
class ModelA : IModel {}
class ModelB : IModel {}

这里你说TIPen应该实现 IModel接口(interface)(也可以是基类,如 BaseModel ),并为您的模型实现该接口(interface)。将所有模型通用的方法放入该接口(interface)。然后你可以这样做:

class Qwerty {
public IPen<IModel> A { get; set; }

public Qwerty() {
if (true) {
A = new PenModelA();
}
else {
A = new PenModelB();
}
}
}

能够将特定的笔(如 PenModelA )分配给 IPen<IModel> - 你需要制作T IPen 中的协变(out 关键字,就像我们在上面的示例中所做的那样)。这限制了你如何使用 T内部界面。协变类型不能用作方法参数:

interface IPen<out T> where T : IModel {
// NOT allowed
void SetModel(T model);
}

但可以用作返回类型:

interface IPen<out T> where T : IModel {
// allowed
T GetModel(T model);
}

2) 定义接口(interface)的非通用版本并从中继承通用版本:

 interface IPen {}
inerface IPen<T> : IPen {}

将所有非泛型方法放到非泛型接口(interface)中,然后像这样使用:

class Qwerty {
public IPen A { get; set; }

public Qwerty() {
if (true) {
A = new PenModelA();
}
else {
A = new PenModelB();
}
}
}

关于c# - 没有接口(interface)的通用方法是否可以初始化属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48877660/

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