gpt4 book ai didi

c# - 从处理抽象类实例的抽象类调用方法

转载 作者:行者123 更新时间:2023-11-30 13:35:42 25 4
gpt4 key购买 nike

假设我有一个像这样的抽象类:

abstract class MyAbstractClass
{
public object GetValue(object parameter)
{
Console.WriteLine("Hello from object");
return parameter;
}
}

此外,我还有另一个扩展 MyAbstractClass 的抽象类:

abstract class MyAbstractClass<T> : MyAbstractClass
{
public T GetValue(T parameter)
{
Console.WriteLine("Hello from generics");
return parameter;
}
}

一个简单的具体类使用string作为泛型类型参数:

class MyImpClass : MyAbstractClass<string> { }

现在,我要声明 MyAbstractClass 的列表(没有通用类型),添加 MyImpClass 的实例并调用您的 GetValue方法。

public static void Main(string[] args)
{
IList<MyAbstractClass> list = new List<MyAbstractClass>();
list.Add(new MyImpClass());
list[0].GetValue("Testing...");
}

目前来自MyAbstractClass的方法(没有泛型类型参数)被调用并且 "Hello from object"打印出来。

如果我直接从 MyImpClass 的实例调用该方法来自 MyAbstractClass<T> 的方法被调用。

new MyImpClass().GetValue("Testing...");

我这样做是因为在我的应用程序的某些部分我需要接收一个 MyAbstractClass<T> 的实例不管泛型类型参数。所以我正在使用 MyAbstractClass 来做这件事.

我的问题是:有没有办法从 MyAbstractClass<T> 调用方法?遍历 MyAbstractClass 的列表?

希望我已经说得够清楚了。谢谢。

最佳答案

要直接调用通用调用,您需要转换它:

(list[0] as MyAbstractClass<string>)?.GetValue("Testing...");

但在我看来这不是一个好的解决方案,您应该采用以下方法:

  • 在您的泛型类中覆盖非泛型基类的 GetValue并在其中调用通用 GetValue:

    abstract class MyAbstractClass<T> : MyAbstractClass
    {
    public T GetValue(T parameter)
    {
    Console.WriteLine("Hello from generics");
    return parameter;
    }

    public override object GetValue(object parameter)
    {
    return GetValue((T)parameter);
    }
    }
  • 或者,since C# 6.0 ,你也可以这样写:

    public override object GetValue(object parameter) => GetValue((T)parameter);

您还需要将 MyAbstractClass 的方法更改为 virtual:

public virtual object GetValue(object parameter)

关于c# - 从处理抽象类实例的抽象类<T>调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46647687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com