C# 设计问题:需要一些关于如何构造类继承以避免代码重复的技巧吗
让我们假设我在一个名为“Geometry”的类中实现了一些逻辑。 我的类“Line”继承自Geometry并实现了一些在2d中绘制直线的功能,而我的另一个类“Circle”再次继承自Geometry并在2d中绘制圆。 现在,我正在创建另一个类Geometry3d:Geometry,它在几何体的顶部添加功能,实际上强制所有继承的类在3d空间中操作。这里我遇到了这个问题-我想重用Line和Circle类中的所有代码,但也让它们继承Geometry3d类,将它们转换为Line3d和Circle3d类。这是否可以在不复制代码的情况下实现 例如,我如何做到这一点:C# 设计问题:需要一些关于如何构造类继承以避免代码重复的技巧吗,c#,class,inheritance,merge,C#,Class,Inheritance,Merge,让我们假设我在一个名为“Geometry”的类中实现了一些逻辑。 我的类“Line”继承自Geometry并实现了一些在2d中绘制直线的功能,而我的另一个类“Circle”再次继承自Geometry并在2d中绘制圆。 现在,我正在创建另一个类Geometry3d:Geometry,它在几何体的顶部添加功能,实际上强制所有继承的类在3d空间中操作。这里我遇到了这个问题-我想重用Line和Circle类中的所有代码,但也让它们继承Geometry3d类,将它们转换为Line3d和Circle3d类。
var myCircle2d = new Circle(); // this would be Geometry : Circle
var myCircle3d = new Circle3d(); // this would be Geometry : Geometry3d: Circle: Circle3d
请注意,Circle类中的代码是相同的,Circle3d类将是一个空容器
有没有一种设计模式可以像这样注入父类?在C#中不能从多个基类继承。你通常可以通过合成来解决这个问题。可以使Geometry3D包含几何图形作为成员变量,如下所示:
class GenericGeometry3D<T> : Geometry3D where T : Geometry{
T InnerGeometry;
public GenericGeometry3D(T innerGeometry){
InnerGeometry = innerGeometry;
}
//implement functionality of Geometry by redirecting to the inner geometry
//you can auto generate these methods in VS by selecting 'Implement through'
public void MethodInGeometry(){
InnerGeometry.MethodInGeometry();
}
//...
//extra functionality provided by Geometry3D
//...
}
class Circle3D : GenericGeometry3D<Circle>{
public Circle3D(...) : base (new Circle(...)) { }
}
类GenericGeometry3D:Geometry3D其中T:Geometry{
T内部几何;
公共通用几何3D(T innerGeometry){
InnerGeometry=InnerGeometry;
}
//通过重定向到内部几何图形来实现几何图形的功能
//您可以通过选择“通过实现”在VS中自动生成这些方法
公共空隙法几何法(){
InnerGeometry.MethodingGeometry();
}
//...
//Geometry3D提供的额外功能
//...
}
然后,您将自动拥有GenericGeometry3D
和GenericGeometry3D
类。我不确定这个图案是否有名字。这有点类似于装饰图案
然后,您可以创建Circle3D,如下所示:
class GenericGeometry3D<T> : Geometry3D where T : Geometry{
T InnerGeometry;
public GenericGeometry3D(T innerGeometry){
InnerGeometry = innerGeometry;
}
//implement functionality of Geometry by redirecting to the inner geometry
//you can auto generate these methods in VS by selecting 'Implement through'
public void MethodInGeometry(){
InnerGeometry.MethodInGeometry();
}
//...
//extra functionality provided by Geometry3D
//...
}
class Circle3D : GenericGeometry3D<Circle>{
public Circle3D(...) : base (new Circle(...)) { }
}
class Circle3D:GenericGeometry3D{
公共圆3D(…):基圆(新圆(…){}
}
从旁注开始,您的父类可能应该命名为Shape
<代码>几何体过于宽泛,使用这样的名称,它将承担太多的责任。也就是说,我会做Shape
,Shape:Shape2D
和Shape:Shape3D
。更好的是,概括维度,只做Shape
,Shape:Sphere
,和Shape:Circle
对,我这样做没有问题。这里的要点是,在我的例子中,Circle和Sphere类中的代码完全相同。不同的行为被提取并存在于Shape3d类中。所以我可以做Shape:Circle,也可以做Shape:Shape3d:Sphere,并将我所有的代码从Circle复制/粘贴到我的Sphere类中。。。这并不完全是一种最佳实践思想,请注意,继承只是重用代码的众多方法之一。例如,您可以让Circle和Circle3d实现一个公共接口,并在其他类上声明的方法中对其中一个的实例进行操作。