如何在抽象 class 中定义一个具有不同 classes 作为输入参数的方法?
How to define a method in abstract class with different classes as input parameter?
我有一个摘要 class,例如:
public abstract class CPD
{
public double[,] Func(double[] data, double value, SomeClass item)
{
// Some code
}
public abstract double[] Fun1(double x);
public abstract void Fun2(double x);
}
而且我还有 3 个不同的 classes,具有不同的构造函数、函数等。我想以某种方式定义代码中的方法“Func”,以便能够用作输入参数(而不是“SomeClass”)我拥有的 3 个不同 classes 之一。
因此,每当我调用这 3 个 class 中的一些时,我可以覆盖方法“Fun1”和“Fun2”,但我可以始终在这 3 个 class 中的任何一个中使用方法“Func”。
我该怎么做?
如果你只想使用一个 class 而不是三个 class,你可以创建一个基础 class 或接口,并将相同的行为放入这个新创建的抽象 class。然后在你的 Func
方法中调用它。
比如我们可以创建一个摘要class Display
:
public abstract class Display
{
public abstract string Show();
}
然后有必要创建这个基础的具体实现 class Display
:
public class SamsungDisplay : Display
{
public override string Show()
{
return "I am Samsung";
}
}
public abstract class SonyDisplay : Display
{
public override string Show()
{
return "I am Sony";
}
}
public abstract class DellDisplay : Display
{
public override string Show()
{
return "I am Dell";
}
}
然后我们可以使用任何派生的 class 而不是基础 class:
// Here you can pass SamsungDisplay, SonyDisplay or DellDisplay
public void UseDisplay(Display display)
{
display.Show();
}
正如其他人所说,您可以使用接口或通用基础 class 来完成此操作。但为了完整起见:您还可以使用通用的:
public class SomeClass
{
private static readonly Random Random = new Random();
public virtual double Get()
{
return Random.Next(100);
}
}
public class Class1 : SomeClass { }
public class Class2 : SomeClass { }
public class Class3 : SomeClass { }
public abstract class CPD
{
public double[,] Func<T>(double[] data, double value, T item)
where T : SomeClass
{
var doubles = new double[3, 4];
doubles[0, 0] = item.Get();
return doubles;
}
public abstract double[] Fun1(double x);
public abstract void Fun2(double x);
}
我有一个摘要 class,例如:
public abstract class CPD
{
public double[,] Func(double[] data, double value, SomeClass item)
{
// Some code
}
public abstract double[] Fun1(double x);
public abstract void Fun2(double x);
}
而且我还有 3 个不同的 classes,具有不同的构造函数、函数等。我想以某种方式定义代码中的方法“Func”,以便能够用作输入参数(而不是“SomeClass”)我拥有的 3 个不同 classes 之一。
因此,每当我调用这 3 个 class 中的一些时,我可以覆盖方法“Fun1”和“Fun2”,但我可以始终在这 3 个 class 中的任何一个中使用方法“Func”。
我该怎么做?
如果你只想使用一个 class 而不是三个 class,你可以创建一个基础 class 或接口,并将相同的行为放入这个新创建的抽象 class。然后在你的 Func
方法中调用它。
比如我们可以创建一个摘要class Display
:
public abstract class Display
{
public abstract string Show();
}
然后有必要创建这个基础的具体实现 class Display
:
public class SamsungDisplay : Display
{
public override string Show()
{
return "I am Samsung";
}
}
public abstract class SonyDisplay : Display
{
public override string Show()
{
return "I am Sony";
}
}
public abstract class DellDisplay : Display
{
public override string Show()
{
return "I am Dell";
}
}
然后我们可以使用任何派生的 class 而不是基础 class:
// Here you can pass SamsungDisplay, SonyDisplay or DellDisplay
public void UseDisplay(Display display)
{
display.Show();
}
正如其他人所说,您可以使用接口或通用基础 class 来完成此操作。但为了完整起见:您还可以使用通用的:
public class SomeClass
{
private static readonly Random Random = new Random();
public virtual double Get()
{
return Random.Next(100);
}
}
public class Class1 : SomeClass { }
public class Class2 : SomeClass { }
public class Class3 : SomeClass { }
public abstract class CPD
{
public double[,] Func<T>(double[] data, double value, T item)
where T : SomeClass
{
var doubles = new double[3, 4];
doubles[0, 0] = item.Get();
return doubles;
}
public abstract double[] Fun1(double x);
public abstract void Fun2(double x);
}