簡體   English   中英

C#如何實例化抽象基類的派生對象

[英]C# How to instantiate derived objects from abstract base 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;
}

的確,您不能實例化一個抽象類,但這並不意味着一個抽象類不能具有構造函數。
在抽象類中使用構造函數,並將其鏈接到具體的實現類構造函數:

 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;}
 }

類似於以下內容的內容與您當前的處理方式最接近。 在此設置中,您的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方法中設置的任何屬性,因為它們實際上尚未存在。

如果在構造對象時需要這些屬性,則唯一的方法是將它們傳遞到每個形狀的構造函數中。 其他答案已經解決了這個問題,所以我不再重復他們要說的話。

我應該注意,由於我不知道您的實際代碼是什么樣子,因此我故意提供了一個盡可能接近您原始代碼的答案。 像其他人一樣在構造函數中設置值可能是更好的解決方案,但是只有您可以判斷實際代碼中的最佳值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM