В Java это справедливо:C# mimic Java generic?
class Class1<T extends OtherType> { T t; ... }
//Inside other class that has no relation to Class1
private Class1 class1; //No type needed
public void someOtherFunction (Class1 class1) //Works
{
this.class1 = class1; //May warn about invalid type casting
class1.someFunction();
}
C# требует типа в тех же условиях:
class Class1<T> where T : OtherType { T t; ... }
//Inside other class that has no relation to Class1
private Class1<TYPE DEMANDED> class1; //I don't know generic what type, and honestly it doesn't matter.
public void someOtherFunction (Class1 class1) //This is the definition I want to use, but C# Demands a type to class1
public void someOtherFunction<T> (Class1<T> class1) where T : OtherType //C# Demands a type to class1 so I must specify a T
{
this.class1 = class1;
class1.someFunction();
} //This function is valid but then it still needs the type to store it.
Есть ли способ, чтобы опустить тип? Нет необходимости знать тип, так зачем он нужен? Я не могу сделать Class1
типа OtherType
, потому что точка родоначальника должна иметь неизвестный тип, который расширяет базу OtherType
. Я могу обойти это, но это, безусловно, самое эффективное решение, если бы это была Java, и мне придется набирать cast как только фрейм для нескольких объектов, если это не сработает, что я волнуюсь, будет складываться быстро.
Фактический код, по запросу:
public abstract class Weapon { ... }
public abstract class WeaponProxy<T> : MonoBehaviour where T : Weapon
{
protected T weapon;
public virtual void Update()
{
...
holdingPlayer = player.getHUD().showPickup(player, this);
...
}
public abstract class GunProxy<T> : WeaponProxy<T> where T : Gun
{
}
public abstract class Weapon
{
private string weaponName;
private string weaponIdentifier;
private Player isHolding;
public string getWeaponName() { return weaponName; }
public Weapon(string weaponName, string weaponIdentifier)
{
this.weaponName = weaponName;
this.weaponIdentifier = weaponIdentifier;
}
public void playerPickedUp (Player player)
{
this.isHolding = player;
}
public void playerDropped()
{
this.isHolding = null;
}
}
public class Gun : Weapon
{
...
}
public class HUD : MonoBehaviour
{
private WeaponProxy weapon; //C# Needs a type. Underlined in red as error
public PlayerProxy showPickup<T> (PlayerProxy player, WeaponProxy<T> weapon) where T : Weapon
{
this.weapon = weapon;
textPickupWeapon.text = "Hold '" + player.getPlayer().getControlScheme().getControlText(ControlScheme.CONTROLS.Interact) + "' to pick up " + weapon.getWeapon().getWeaponName();
...
}
}
'class' и' object' зарезервированы на C#; не используйте их как имя переменной. –
@EricLippert Я знаю, я исправлю это сейчас. Спасибо. –
Не знаете, как работает Java, но в .NET общие типы с разными параметрами типа фактически являются разными типами. Эти «построенные общие типы» генерируются компилятором, поэтому параметр типа должен быть известен во время компиляции. Поэтому я не думаю, что использовать его так, как вы пишете, это возможно. Для получения дополнительной информации см. MSDN: https://msdn.microsoft.com/en-us/library/ms172192(v=vs.110).aspx – vesan