【问题标题】:Is there a way to declare an object with a generic type parameter, without defining the type? [duplicate]有没有办法用泛型类型参数声明一个对象,而不定义类型? [复制]
【发布时间】:2021-02-23 22:20:16
【问题描述】:

我有一个带有泛型类型参数的抽象类,以便用户可以在子类中定义正确的功能:

public abstract class Fruit<TFruit>{
    public abstract TFruit CutFruit();
    public abstract float TypeIndependentMethod();
}

外部类要调用类中类型无关的抽象方法,不需要知道子类的类型参数。它只想调用该类的TypeIndependentMethod() 实现:

public class FruitLabeler
{
    public Fruit fruit = null;

    public void WriteLabel(){
        float f = fruit.TypeIndependentMethod();
    }
}

问题是我不能在没有类型参数的情况下声明 public Fruit fruit,编译器要求我声明 Fruit&lt;Orange&gt; fruitFruit&lt;Apple&gt; fruit 等。但我不希望我的 FruitLabeler 仅适用于 Oranges 或苹果,我希望它适用于任何水果。

我如何声明一个与类型无关的Fruit 实例,或者如何将其称为与泛型类型无关的方法?

【问题讨论】:

  • 它没有意义,为此创建非泛型类......也似乎XY problem
  • Fruit&lt;Apple&gt; 也不是自然的...因为 Apple 是 Fruit 而不是 Fruit 的参数
  • @Selvin 好的,我对示例进行了过度抽象,但问题仍然很清楚。有些方法使用泛型类型,有些方法不使用。我需要在不知道泛型类型的情况下从外部类调用不使用泛型类型的方法。
  • “我如何声明一个与类型无关的 Fruit 实例” -- 就像在任何 OOP 语言中对任何共享成员所做的一样:创建一个基类由相关类型继承或实现的类型(C# 中的类或接口)。请参阅副本以获取众多示例之一。

标签: c# types abstract-class abstraction


【解决方案1】:

如果为与类型无关的方法引入 IFruit 接口,则可以改用IFruit fruit 并在不知道类型的情况下调用方法

 public abstract class Fruit<TFruit> : IFruit{
        public abstract TFruit CutFruit();
        public abstract float TypeIndependentMethod();
    }

    public interface IFruit
    {
        public float TypeIndependentMethod();
    }

    public class FruitLabeler
    {
        public IFruit fruit = null;

        public void WriteLabel(){
            float f = fruit.TypeIndependentMethod();
        }
    }

【讨论】:

  • 旁注:基类可能更符合 OP 的要求 - 使用接口无法保证它实际上是 Fruit&lt;TFruit&gt; 的实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
相关资源
最近更新 更多