sách gpt4 ăn đã đi

c# - Generic 基类继承自 Generic Interface

In lại 作者:太空狗 更新时间:2023-10-29 23:01:33 28 4
mua khóa gpt4 giày nike

出于某种原因,我正在努力通过使用通用基类来实现通用接口(interface)的属性,如下所示:

public interface IParent where TChild : IChild
{
TChild Child { get; }
}

public interface IChild { }

然后我有一个基类:

public class ParentBase : IParent where TChild : IChild
{
private TChild _child;
public ParentBase(TChild child)
{
this._child = child;
}
#region IParent Members

public TChild Child
{
get { return _child; }
}

#cuối vùng
}

现在我有一个新的 Parent Derivative 和 Child 对象如下:

public class MyChild : IChild { }

public class MyParent : ParentBase, IParent
{
public MyParent(MyChild child)
: base(child)
{
}
}

我想实例化它并获取抽象(接口(interface)类型)传递给消费者,如下所示:

IParent parent = new MyParent(new MyChild());

但出于某种原因我无法正确实现 TChild,即使我已经在 ParentBase 上定义了属性 public TChild Child,编译器说它没有实现,即使我尝试显式实现。如您所见,约束一直贯穿到基类。

câu trả lời hay nhất

您正在从 ParentBase 派生 MyParent|和 IParent .没有实现

IParent { IChild Child{get; } }

添加显式实现将允许您的原始代码编译

public class MyParent : ParentBase, IParent
{
public MyParent(MyChild child)
: base(child)
{
}

#region Implementation of IParent

IChild IParent.Child
{
get { return base.Child; }
}

#cuối vùng
}

如果你也像这样使 IParent 协变:

public interface IParent where TChild : IChild
{
TChild Child { get; }
}

那么你现在可以这样做了

IParent parent = new MyParent(new MyChild());

hoặc

ParentBase parent2 = new MyParent(new MyChild());

IParent parent3 = parent2;

正如@svick 在回答中指出的那样,借助协方差,您可以通过不从 IParent 派生来简化并删除显式接口(interface)实现。

关于c# - Generic 基类继承自 Generic Interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10189793/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress