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 ? (我试图使用类似于界面的泛型)。如果不可能,那么泛型作为参数的用途是什么?
答案 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();
}