आप उदाहरण के स्तर के सार तरीकों जो आपके उपवर्ग ओवरराइड कर सकते हैं की घोषणा कर सकता है ThirdVectorType
कक्षा?) और शायद शून्य मामलों को संभालना। साथ ही, यह सुनिश्चित कर लें कि SubVector.Add
कम्यूटेटिव ऑपरेशंस की बात करते समय SomeOtherSubVectorClass.Add
जैसा व्यवहार करता है।
संपादित करें: अपने अन्य टिप्पणी के आधार पर, आप ऐसा कुछ की तरह कर सकते हैं:
public class Vector2D : Vector
{
public double X { get; set; }
public double Y { get; set; }
protected override Vector Add(Vector otherVector)
{
Vector2D otherVector2D = otherVector as Vector2D;
if (otherVector2D != null)
return new Vector2D() { X = this.X + otherVector2D.X, Y = this.Y + otherVector2D.Y };
Vector3D otherVector3D = otherVector as Vector3D;
if (otherVector3D != null)
return new Vector3D() { X = this.X + otherVector3D.X, Y = this.Y + otherVector3D.Y, Z = otherVector3D.Z };
//handle other cases
}
}
public class Vector3D : Vector
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
protected override Vector Add(Vector otherVector)
{
Vector2D otherVector2D = otherVector as Vector2D;
if (otherVector2D != null)
return new Vector3D() { X = this.X + otherVector2D.X, Y = this.Y + otherVector2D.Y, Z = this.Z };
Vector3D otherVector3D = otherVector as Vector3D;
if (otherVector3D != null)
return new Vector3D() { X = this.X + otherVector3D.X, Y = this.Y + otherVector3D.Y, Z = this.Z + otherVector3D.Z };
//handle other cases
}
}
EDITx2:
अपने नवीनतम टिप्पणी को देखते हुए, शायद अपने बस एक आंतरिक सरणी/मैट्रिक्स को बनाए रखने और चाहिए सिर्फ सामान्य कर मैट्रिक्स गणित। आपका उपवर्गों सरणी indicies के खिलाफ एक्स/Y/Z संपत्ति रैपर को बेनकाब कर सकते हैं:
public class Vector
{
protected double[] Values;
public int Length { get { return Values.Length; } }
public static Vector operator +(Vector v1, Vector v2)
{
if (v1.Length != v2.Length)
{
throw new VectorTypeException("Vector Dimensions Must Be Equal");
}
else
{
//perform generic matrix addition/operation
double[] newValues = new double[v1.Length];
for (int i = 0; i < v1.Length; i++)
{
newValues[i] = v1.Values[i] + v2.Values[i];
}
//or use some factory/service to give you a Vector2D, Vector3D, or VectorND
return new Vector() { Values = newValues };
}
}
}
public class Vector2D : Vector
{
public double X
{
get { return Values[0]; }
set { Values[0] = value; }
}
public double Y
{
get { return Values[1]; }
set { Values[1] = value; }
}
}
public class Vector3D : Vector
{
public double X
{
get { return Values[0]; }
set { Values[0] = value; }
}
public double Y
{
get { return Values[1]; }
set { Values[1] = value; }
}
public double Z
{
get { return Values[2]; }
set { Values[2] = value; }
}
}
EDITx3: अपने नवीनतम टिप्पणी के आधार पर, मुझे लगता है कि आप प्रत्येक उपवर्ग पर ऑपरेटर भार के लागू कर सकता है, एक स्थिर विधि में साझा तर्क करना (आधार वेक्टर कक्षा में कहते हैं), और कहीं एक विशिष्ट उपवर्ग प्रदान करने के लिए एक स्विच/मामले की जांच करते हैं:
private static Vector Add(Vector v1, Vector v2)
{
if (v1.Length != v2.Length)
{
throw new VectorTypeException("Vector Dimensions Must Be Equal");
}
else
{
//perform generic matrix addition/operation
double[] newValues = new double[v1.Length];
for (int i = 0; i < v1.Length; i++)
{
newValues[i] = v1.Values[i] + v2.Values[i];
}
//or use some factory/service to give you a Vector2D, Vector3D, or VectorND
switch (newValues.Length)
{
case 1 :
return new Vector1D() { Values = newValues };
case 2 :
return new Vector2D() { Values = newValues };
case 3 :
return new Vector3D() { Values = newValues };
case 4 :
return new Vector4D() { Values = newValues };
//... and so on
default :
throw new DimensionOutOfRangeException("Do not support vectors greater than 10 dimensions");
//or you could just return the generic Vector which doesn't expose X,Y,Z values?
}
}
}
फिर अपने उपवर्गों होगा:
public class Vector2D
{
public static Vector2D operator +(Vector2D v1, Vector2D v2)
{
return (Vector2D)Add(v1, v2);
}
}
public class Vector3D
{
public static Vector3D operator +(Vector3D v1, Vector3D v2)
{
return (Vector3D)Add(v1, v2);
}
}
कुछ दोहराव, लेकिन मैं इसे चारों ओर एक तरह से मेरे सिर के ऊपर से नहीं दिख रहा संकलक यह करने के लिए अनुमति देने के लिए:
Vector3 v1 = new Vector3(2, 2, 2);
Vector3 v2 = new Vector3(1, 1, 1);
var v3 = v1 + v2; //Vector3(3, 3, 3);
Console.WriteLine(v3.X + ", " + v3.Y + ", " + v3.Z);
या के लिए अन्य आयामों:
Vector2 v1 = new Vector2(2, 2);
Vector2 v2 = new Vector2(1, 1);
var v3 = v1 + v2; //Vector2(3, 3, 3);
Console.WriteLine(v3.X + ", " + v3.Y); // no "Z" property to output!
आपके व्युत्पन्न वर्ग कैसा दिखते हैं? – JotaBe
यह मेरे लिए अजीब लगता है कि आपको 'वेक्टर' को उप-वर्ग करना होगा (जो मुख्य रूप से 'डबल' की सरणी प्रतीत होता है।) क्या आप अपने पदानुक्रम के बारे में कुछ और बता सकते हैं? – dlev
'वेक्टर' + वेक्टर बी 'का नतीजा क्या होगा, मानते हैं कि दोनों' वेक्टर 'से प्राप्त होते हैं? –