Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用继承时接口实现出现问题_C#_Inheritance_Interface - Fatal编程技术网

C# 使用继承时接口实现出现问题

C# 使用继承时接口实现出现问题,c#,inheritance,interface,C#,Inheritance,Interface,我已经创建了IsAllowClonable接口来为我的所有类创建类的浅层副本,但是继承不能正常工作 看看Main方法,node2返回的是Point3D对象,而不是Node 细节 Point2D是基类 从Point2D类派生的Point3D类 节点 从Point3D类派生的类 使用系统; 名称空间控制台测试 { 内部静态类程序 { 私有静态void Main() { 尝试 { var节点=新节点(1,0,0,0); var node2=node.ShallowClone();//此代码正在返回

我已经创建了IsAllowClonable接口来为我的所有类创建类的浅层副本,但是继承不能正常工作

看看Main方法,node2返回的是Point3D对象,而不是Node

细节

  • Point2D是基类
  • 从Point2D类派生的Point3D类
  • 节点 从Point3D类派生的类
使用系统;
名称空间控制台测试
{
内部静态类程序
{
私有静态void Main()
{
尝试
{
var节点=新节点(1,0,0,0);
var node2=node.ShallowClone();//此代码正在返回Point3D对象,而不是节点
}
捕获(例外)
{
投掷;
}
最后
{
Console.ReadLine();
}
}
}
公共接口是允许克隆的
{
T浅克隆();
}
公共类Point2D:IsAllowClonable
{
公共整数X{get;set;}
公共整数Y{get;set;}
公共点2D()
{
}
公共点2D(整数x,整数y)
{
X=X;
Y=Y;
}
公共点2D浅克隆()
{
返回新的点2d(X,Y);
}
}
公共类Point3D:Point2D,ISAllowClonable
{
公共int Z{get;set;}
公共点3D()
{
}
公共点3D(int x,int y,int z):基(x,y)
{
Z=Z;
}
新公共点3D浅克隆()
{
返回新的点3d(X,Y,Z);
}
}
公共类节点:Point3D,IsAllowClonable
{
公共int Id{get;set;}
公共节点()
{
}
公共节点(int-id,int-x,int-y,int-z):基(x,y,z)
{
Id=Id;
}
节点IsAllowClonable.ShallowClone()
{
返回新节点(Id,X,Y,Z);
}
}
}

因为对于
节点
您已经实现了
IsAllowClonable
as,所以只有当您强制转换到它时它才会工作:

// prints Node
Console.WriteLine(((IShallowCloneable<Node>)node).ShallowClone().GetType().Name); 
//打印节点
Console.WriteLine(((ishAllowClonable)节点).ShallowClone().GetType().Name);

如果你想让它像
Point3D
那样运行,你需要像在那里一样实现它(用关键字隐藏继承的
Point2D
实现)。

因为对于
节点
你已经实现了
IsAllowClonable
作为,所以只有当你强制转换到它时它才会工作:

// prints Node
Console.WriteLine(((IShallowCloneable<Node>)node).ShallowClone().GetType().Name); 
//打印节点
Console.WriteLine(((ishAllowClonable)节点).ShallowClone().GetType().Name);

如果您想让它表现为
Point3D
,您需要像在那里一样实现它(用关键字隐藏继承的
Point2D
实现)。

所以如果您想显式地使用ShallowClone方法而不更改类

var node = new Node(1, 0, 0, 0);
var node2 = ((IShallowCloneable<Node>)node).ShallowClone();
附加参考


所以如果您想显式地使用ShallowClone方法而不更改类

var node = new Node(1, 0, 0, 0);
var node2 = ((IShallowCloneable<Node>)node).ShallowClone();
附加参考


请解释为什么这是answer@ColinM现在,我的解释可以了吗?请解释一下为什么这是answer@ColinM现在,我的解释可以了吗?