[英]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.