C# 设计问题:需要一些关于如何构造类继承以避免代码重复的技巧吗

C# 设计问题:需要一些关于如何构造类继承以避免代码重复的技巧吗,c#,class,inheritance,merge,C#,Class,Inheritance,Merge,让我们假设我在一个名为“Geometry”的类中实现了一些逻辑。 我的类“Line”继承自Geometry并实现了一些在2d中绘制直线的功能,而我的另一个类“Circle”再次继承自Geometry并在2d中绘制圆。 现在,我正在创建另一个类Geometry3d:Geometry,它在几何体的顶部添加功能,实际上强制所有继承的类在3d空间中操作。这里我遇到了这个问题-我想重用Line和Circle类中的所有代码,但也让它们继承Geometry3d类,将它们转换为Line3d和Circle3d类。

让我们假设我在一个名为“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实现一个公共接口,并在其他类上声明的方法中对其中一个的实例进行操作。