C#如何从抽象基类实例化派生对象

时间:2017-10-18 14:15:58

标签: c# abstract-class

假设我有一个抽象基类,Shape,然后是三个派生类:Triangle,Rectangle和Pentagon。必须根据需求创建派生类,这样我就可以拥有每个派生类中的几个。基类有很多字段,我一直在寻找一种方法只设置一次基类属性,然后稍后为派生类设置不同的字段。既然你无法实例化一个抽象类,那么最好的方法是什么?我想也许创建另一个派生自Shape的类,它只有Shape的属性,设置那些属性然后再抛出它但这似乎效率低下并且在它上面写了代码味道。有人可以提出更好的方法吗?谢谢。下面我写了一些伪代码

public abstract class Shape
{
    public int x, y, z;
}

public class Triangle : Shape
{
   public int a, b, c       
}

public class Facade : Shape
{
}

private Facade InitializeBaseProperties()
{
    Facade f = new Training
    {
       x = 1, y = 2, z = 3
    };
    return f;
}

private void someMethod()
{
   var tmp = InitializeBaseProperties();
   Triangle triangle = tmp;
}

2 个答案:

答案 0 :(得分:5)

确实无法实例化抽象类,但这并不意味着抽象类不能有构造函数。
在抽象类中使用构造函数并将其链接到具体的实现类构造函数:

 public abstract class Shape
 {
      protected int _x, _y, _z;
      protected Shape(int x, int y, int z)
      {
          _x = x;
          _y = y;
          _z = z;
      }
 }

然后,在派生类中:

 public class Triangle : Shape
 {
      public Triangle (int x, int y, int z, int a, int b) : base(x,y,z)
      {
          A = a;
          B = b;
      }

      public int A {get;}
      public int B {get;}
 }

答案 1 :(得分:0)

以下内容与您当前的做事方式最为接近。在此设置中,InitializeBaseProperties现在采用形状并在其上设置属性。然后,您可以在创建三角形后将其传递给它。

private void InitializeBaseProperties(Shape shape)
{
    shape.x = 1;
    shape.y = 2;
    shape.z = 3;
}

private void someMethod()
{
   Triangle triangle = new Triangle();
   InitializeBaseProperties(triangle);
}

此解决方案要求Triangle的初始化实际上并不使用您在InitializeBaseProperties方法中设置的任何属性,因为它们实际上还没有真正存在

如果在构造对象时需要那些属性,那么执行此操作的唯一方法是将它们传递到每个形状的构造函数中。其他答案已经解决了这个问题,所以我不会重复他们要说的话。

我应该注意,我故意提供了尽可能接近原始代码的答案,因为我不知道您的实际代码是什么样的。像其他人一样在构造函数中设置值可能是更好的解决方案,但只有您可以判断实际代码中的最佳值。