如何在抽象 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);
}