使用泛型作为c#中的参数

时间:2014-09-28 12:07:05

标签: c# generics

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns
{
    public class Composite
    {
        public Composite()
        {
            Console.WriteLine("I am Composite class constructor");
        }

        public void add()
        {
            Console.WriteLine("Added to Composite class");
        }
    }

    public class Component
    {
        public Component()
        {
            Console.WriteLine("I am Component class constructor");
        }

        public void add()
        {
            Console.WriteLine("Added to Component class");
        }
    }
}

我想在上面的代码中调用add函数。我不想使用接口。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns
{
    class Program
    {
        static void Main(string[] args)
        {
            new Examp().Add(new Component());
            new Examp().Add(new Composite());
            Console.Read();
        }
    }

    public class Examp
    {
        public void Add<T>(T classinstance)
        {
            Console.WriteLine("Added " + classinstance + " to the Examp class");
            ((Composite)classinstance).add();
        }
    }
}

这是一个编译器错误。如果以这种方式无法做到这一点,如何在这里使用 classinstance ? (我试图使用类似于界面的泛型)。如果不可能,那么泛型作为参数的用途是什么?

3 个答案:

答案 0 :(得分:2)

Make Composite和Component实现一个接口

public interface IMyI
{
    void add();
}

您的两个班级实施IMyI并将您的Examp.Add更改为

public void Add<T>(T classinstance) where T : IMyI
{
    Console.WriteLine("Added " + classinstance + " to the Examp class");
    classinstance.add();
}

答案 1 :(得分:2)

我还强烈建议您使用@artm中提供的接口和类似解决方案。但如果您真的不想使用界面,可以使用dynamic参数并更改Add类中的Examp方法:

public void Add(dynamic classinstance)
{
    Console.WriteLine("Added " + classinstance + " to the Examp class");
    classinstance.add();
}

答案 2 :(得分:0)

如果您不想使用接口,并且您的Add方法实际上只是做了类似的事情,那么您也可以为这两种类型提供重载:

public void Add (Composite classinstance)
{
    Console.WriteLine("Added " + classinstance + " to the Examp class");
    classinstance.add();
}

public void Add (Component classinstance)
{
    Console.WriteLine("Added " + classinstance + " to the Examp class");
    classinstance.add();
}

但是如果你打算将这些对象添加到某个东西,例如一个集合,你肯定应该使用一个共同的基本类型,例如与其他人建议的界面,以便您保留其类型,而不必将其添加为无信息object s。

然后你可以使用界面来访问事物:

private List<IAddable> list = new List<IAddable>();

public void Add (IAddable obj)
{
    Console.WriteLine("Added {0} to the Examp class", obj);
    list.Add(obj); // actually add the object to some collection
    obj.add();
}