根据子类C#指定泛型类型

时间:2015-11-24 18:47:52

标签: c# generics inheritance

在C#中是否可以在基类中定义泛型方法,然后根据子类调用它来定义类型。

abstract class BaseClass
{
    void SomeMethod<T>()
    {
        ...
    }
}

class SubClass1 : BaseClass
{
    ...
}

class SubClass2 : BaseClass
{
    ...
}

现在,如果我从SubClass1的一个实例调用SomeMethod,我希望它使用一种类型(让我们说是字符串),如果我从SubClass2的实例调用它,我希望它使用不同的类型(让&# 39; s说int)。所以......

BaseClass instance1 = new SubClass1();
BaseClass instance2 = new SubClass2();
instance1.SomeMethod() //this should call SomeMethod<string>()
instance2.SomeMethod() //this should call SomeMethod<int>()

这可能吗?

更新

我想为一个BaseClass变量分配一个SubClass1或SubClass2的实例:

for (int i = 0; i < numSubClasses; i++)
{
    BaseClass variable = GetNextSubClass(); //On first iteration GetNextSublass returns an instance of SubClass1 and on second iteration it returns an instance of SubClass2
    variable.SomeMethod();
}

我想在基类中使用泛型实现的原因是因为除了类型

之外,两个子类的实现完全相同

2 个答案:

答案 0 :(得分:3)

将泛型类型添加到Base类:

abstract class BaseClass<T>
{
    void SomeMethod<T>()
    {
        ...
    }
}

class SubClass1 : BaseClass<string>
{
    ...
}

class SubClass2 : BaseClass<int>
{
    ...
}

上面的代码有点无意义,因为我们没有使用泛型类型。

abstract class BaseClass<T>
{
    public T SomeMethod<T>(T aParam)
    {
        ...
        return aParam;
    }
}

class SubClass1 : BaseClass<string>
{
    ...
}

class SubClass2 : BaseClass<int>
{
    ...
}

提供一些更具体的例子来说明你想要实现的目标。

答案 1 :(得分:0)

看起来你想使用通用接口:

using System;

class Program
{
    interface IBase<T>
    {
        void SomeMethod();
    }

    class SubClass1 : IBase<string>
    {
        public void SomeMethod()
        {
            Console.WriteLine("I write string!");
        }
    }

    class SubClass2 : IBase<int>
    {
        public void SomeMethod()
        {
            Console.WriteLine("I write int!");
        }
    }

    static void Main(string[] args)
    {
        IBase<string> instance1 = new SubClass1();
        IBase<int> instance2 = new SubClass2();
        instance1.SomeMethod(); //this should call SomeMethod<string>()
        instance2.SomeMethod(); //this should call SomeMethod<int>()

        Console.ReadLine();
    }
}

事实上,你甚至不需要2节课。您可以使用单个泛型类来实现相同的效果:

using System;

class Program
{
    interface IBase
    {
        void SomeMethod();
    }

    class SubClass<T> : IBase
    {
        public void SomeMethod()
        {
            Console.WriteLine("I write {0}", typeof(T));
        }
    }

    static void Main(string[] args)
    {
        IBase instance1 = new SubClass<string>();
        IBase instance2 = new SubClass<int>();
        instance1.SomeMethod(); //this should call SomeMethod<string>()
        instance2.SomeMethod(); //this should call SomeMethod<int>()

        Console.ReadLine();
    }
}