c# – 使Point3D成为从Point2D派生并实现IPoint3D接口的引用类型
抱歉,如果这对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),但我不记得上次我想要隐藏在接口后面的这种坐标系差异. 然后再次打字时,我偶然发现 我的问题是;编码2维和3维点/矢量类型的原因是什么? 因为现在我担心我对现有设计的反应有点膝盖不稳,完全基于:“我从未见过其他人这样做过.”并且“这会伤害表现.”这看起来有点弱 – 我很可能忽略了以这种方式做事的一些很好的理由,而且我都是耳朵. 解决方法
这是一个自以为是的问题,这是一个自以为是的答案……
对于这么简单的事情来说,这是太多的抽象和接口.我只需要我需要的不可变矢量类型. 即使Vector3不断变化,你也是这样做的: ObjectA.Vector3 = SomeTransformationFunction(ObjectA.Vector3); Vector3在这里完全可以是一个不可变类型.我很难找到一个场景,其中描述矢量的可变类型更好,因此如果有疑问,请尽可能简单. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |