加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使Point3D成为从Point2D派生并实现IPoint3D接口的引用类型

发布时间:2020-12-15 22:09:52 所属栏目:百科 来源:网络整理
导读:抱歉,如果这对Code Review堆栈交换更好,但我认为,因为这个问题并不是专门针对代码,而是更多关于引用和值类型之间的概念差异,这里似乎更好. 搜索给了我这个稍微相关的问题:Best Way of Implementing these 3 classes in C#: Vector,Direction (unit vector),
抱歉,如果这对Code Review堆栈交换更好,但我认为,因为这个问题并不是专门针对代码,而是更多关于引用和值类型之间的概念差异,这里似乎更好.

搜索给了我这个稍微相关的问题:Best Way of Implementing these 3 classes in C#: Vector,Direction (unit vector),Point – 但它并不完全.另一方面,搜索“参考与值类型”会给出过于宽泛的答案.

最近我开始使用新的C#代码库.有很多现有的代码,其中包括:

public interface IPoint2D
{
    double X { get; set; }
    double Y { get; set; }
}

public interface IPoint3D : IPoint2D
{
    double Z { get; set; }
}

public class Point2D : IPoint2D
{
    public double X { get; set; }
    public double Y { get; set; }

    // ...additional methods ommitted...
}

public class Point3D : Point2D,IPoint3D
{
    public double Z { get; set; }

    // ...additional methods ommitted...
}

如果重要,接口在一个程序集中定义,另一个在另一个程序集中定义.

由于至少以下原因,这让我感到奇怪:

>作为2维或3维坐标的基本类型是否需要隐藏在接口后面?我想它允许使用极坐标或球坐标实现Carthesian接口(例如,你可以让RoThetaPoint2D实现IPoint2D),但我不记得上次我想要隐藏在接口后面的这种坐标系差异.
>在我看来,IPoint3D扩展了从Point2D派生的IPoint2D和Point3D违反了Liskov substitution principle(虽然我认为在某些投影几何中,人们可能会争辩说3D点’是’一个’2D点).
>使用引用类型会影响性能,尤其是在使用大型点阵列时.
> System.Tuple< float,float,float>尽管如此(据我所知,即使BCL的设计决策也没有争议),我从未见过一个托管代码库,标量三元组被认为是一种引用类型. WinForms,WPF,XNA,SharpDX和新的System.Numerics,它们都使用值类型来表示Point,Vector,Size,Rect等.

然后再次打字时,我偶然发现system.web.ui.datavisualization.charting.point3d,这是一个类(即参考类型) – 我想我可以做更多的例子.

我的问题是;编码2维和3维点/矢量类型的原因是什么?

因为现在我担心我对现有设计的反应有点膝盖不稳,完全基于:“我从未见过其他人这样做过.”并且“这会伤害表现.”这看起来有点弱 – 我很可能忽略了以这种方式做事的一些很好的理由,而且我都是耳朵.

解决方法

这是一个自以为是的问题,这是一个自以为是的答案……

对于这么简单的事情来说,这是太多的抽象和接口.我只需要我需要的不可变矢量类型.

即使Vector3不断变化,你也是这样做的:

ObjectA.Vector3 = SomeTransformationFunction(ObjectA.Vector3);

Vector3在这里完全可以是一个不可变类型.我很难找到一个场景,其中描述矢量的可变类型更好,因此如果有疑问,请尽可能简单.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读