[英]C# Method arguments and Subclass Types
我開始學習 C#,但我對某些事情感到困惑。 假設我有一個類和 2 個子類。 我在父類中有一個名為 Add() 的方法。 但是當我將此方法與子類一起使用時,由於該方法要求的是“Toople”而不是“Vector”或“Point”,它給了我一個錯誤。 我該如何解決這個問題? 有沒有辦法允許將子類插入到方法中,還是應該為每個不同的子類創建新方法? 非常感謝。
using System;
namespace RayTracerChallange
{
public class Toople
{
public float x, y, z, w;
public Toople(float X, float Y, float Z, float W)
{
x = X;
y = Y;
z = Z;
w = W;
}
public Toople Add(Toople Toop)
{
return new Toople(this.x + Toop.x, this.y + Toop.y, this.z + Toop.z, this.w + Toop.w);
}
public class Point : Toople
{
Point(float X, float Y, float Z) : base(X, Y, Z, 1)
{
this.x = X;
this.y = Y;
this.z = Z;
}
}
public class Vector : Toople
{
Vector(float X, float Y, float Z) : base(X, Y, Z, 0)
{
this.x = X;
this.y = Y;
this.z = Z;
}
}
最接近這里的方法是使Toople
通用和抽象,可能是通過執行以下操作:
using System;
namespace RayTracerChallange
{
public abstract class ToopleBase<T> where T : ToopleBase<T>
{
public float x, y, z, w;
protected Toople(float X, float Y, float Z, float W)
{
x = X;
y = Y;
z = Z;
w = W;
}
protected abstract T MakeT(float X, float Y, float Z, float W);
public T Add(Toople Toop)
{
return makeT(this.x + Toop.x, this.y + Toop.y, this.z + Toop.z, this.w + Toop.w);
}
}
public class Toople : ToopleBase<Toople>
{
Toople(float X, float Y, float Z, float W) : base(X, Y, Z, W)
{
}
Toople MakeT(float X, float Y, float Z, float W)
{
return new Toople(X, Y, Z, W);
}
}
public class Point : ToopleBase<Point>
{
Point(float X, float Y, float Z) : base(X, Y, Z, 1)
{
}
protected override Point MakeT(float X, float Y, float Z, float W)
{
return new Point(X, Y, Z);
}
}
public class Vector : ToopleBase<Vector>
{
Vector(float X, float Y, float Z) : base(X, Y, Z, 0)
{
}
protected override Point MakeT(float X, float Y, float Z, float W)
{
return new Vector(X, Y, Z);
}
}
需要注意的幾點:
Toople
就足夠了。 (也就是說,應用程序的其余部分應該能夠期望任何子類與其基類的行為方式相同,甚至不應該知道子類存在。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.