在泛型上使用方法
本文关键字:使用方法 泛型 | 更新日期: 2023-09-27 18:25:53
我有很多这样的方法:
public UIPCompanyButton AddCompanyButton (string name, Company company, UIEventListener.VoidDelegate methodToCall, GameObject contents)
{
return UIPCompanyButton.Create (name, company, methodToCall, contents);
}
我想用这样一种方法来代替:
public T AddButton<T,K>(string name, K item, UIEventListener.VoidDelegate methodToCall, GameObject contents) where T:UIPMenuButton
{
return T.Create(name, item, methodToCall, contents);
}
这显然在t.Create部分不起作用。我需要使用某种语法吗?
我也对具有相同结果的另一个方法持开放态度:一个方法接受派生的menuButton,并创建具有正确类"item"的正确方法。
不,您不能在泛型类型上调用静态方法-不能没有反射。除此之外,没有办法将泛型类型约束为具有特定的静态成员。与之最接近的是无参数构造函数约束。
您想要的是一个创建对象的工厂。下面是一个小的工作示例。这可能不是实现工厂模式的最佳方式,但它应该会让您继续前进。
有关更深入的示例和解释,请参阅本页。
public class Button {
public string Whatever { get; set; }
public Button() {
Whatever = "Hello, world!";
}
}
public interface IAddButton {
Button CreateButton();
}
public class ClassToMakeButtonFor1 {
public static void RegisterMe() {
ButtonFactory.Register(typeof(ClassToMakeButtonFor1), new ButtonFactory1());
}
}
public class ButtonFactory1 : IAddButton {
public Button CreateButton() {
return new Button();
}
}
public class ClassToMakeButtonFor2 {
public static void RegisterMe() {
ButtonFactory.Register(typeof(ClassToMakeButtonFor2), new ButtonFactory2());
}
}
public class ButtonFactory2 : IAddButton {
public Button CreateButton() {
var b = new Button { Whatever = "Goodbye!" };
return b;
}
}
public static class ButtonFactory {
private static Dictionary<Type, IAddButton> FactoryMap = new Dictionary<Type, IAddButton>();
public static void Register(Type type, IAddButton factoryClass) {
FactoryMap[type] = factoryClass;
}
public static Button MakeMeAButton<T>() where T : class {
return FactoryMap[typeof(T)].CreateButton();
}
}
internal class Program {
private static void Main(string[] args) {
ClassToMakeButtonFor1.RegisterMe();
ClassToMakeButtonFor2.RegisterMe();
Button b = ButtonFactory.MakeMeAButton<ClassToMakeButtonFor1>();
Console.WriteLine(b.Whatever);
b = ButtonFactory.MakeMeAButton<ClassToMakeButtonFor2>();
Console.WriteLine(b.Whatever);
Console.ReadLine();
}
}
您可以考虑使用一些接口(例如ICreator)来定义要调用的Create方法。
然后将类型参数约束为实现接口的类型(其中T:ICreator)。
然后,您将在实例上调用该方法,而不是静态方法。所以在您的情况下,也许您可以调用item。创建(…).
对你的案子有意义吗?
听起来您可以将Button类设为泛型。根据每个派生类中的逻辑量,这可能不适用于您。
class Button<T>
{
public T Item { get; private set; }
public Button(string name, T item, ...)
{
// Constructor code
}
}
// Helper class for creation
static class Button
{
public static Button<T> Create<T>(string name, T item, ...)
{
return new Button<T>(name, item, ...);
}
}
然后,使用这个:
Button<Company> button = Button.Create("Name", company, ...);