C#为类的属性定义(多个)可能的类型
我想我在这里遇到了一个基本的OOP误解: (顺便说一句,这些是实体框架6类,以防您对“虚拟”感到惊讶) 但这不是最好的解决方案,对吗? 我想确定受害者可以是一支部队或人群 我还考虑过通过setter实现这一点:C#为类的属性定义(多个)可能的类型,c#,entity-framework,class,oop,properties,C#,Entity Framework,Class,Oop,Properties,我想我在这里遇到了一个基本的OOP误解: (顺便说一句,这些是实体框架6类,以防您对“虚拟”感到惊讶) 但这不是最好的解决方案,对吗? 我想确定受害者可以是一支部队或人群 我还考虑过通过setter实现这一点: public ICollection<object> Victims { get; set { if (value.GetType() == typeof(Troop) || value.GetType() == typeof(Popula
public ICollection<object> Victims { get;
set
{
if (value.GetType() == typeof(Troop) || value.GetType() == typeof(Population))
Victims.Add(value);
}
}
公共ICollection受害者{get;
设置
{
if(value.GetType()==typeof(force)| | value.GetType()==typeof(Population))
增加(价值);
}
}
但我仍然不认为这是最好的方法,或者可能是。。。
有更好、更干净的吗?您可以使用接口
public class WeaponUsed : HistoryEvent
{
public virtual Player Target { get; set; }
public virtual GameCountry Country { get; set; }
//Victims: Troops or Pops
public IVictim Victims { get; set; }
public bool HasMoreWeaponsLeft { get; set; }
}
public interface IVictim {
// common methods and properties for PopVictim and TroopVictim
int Number {get;}
}
public class TroopVictim : IVictim {
// TroopVictim will be enforced to have IVictim methods and proprieties
public int Number{ get {return 1; } }
}
public class PopVictim : IVictim {
// PopVictim will be enforced to have IVictim methods and proprieties
public int Number{ get {return 100; } }
}
用法:
Console.WriteLine(weapon.Victims.Number)
朋友
public interface IVictim
{
string SharedProp { get; set; }
}
public class TroopVictim : IVictim
{
public string SharedProp { get; set; }
public string TroopProperty { get; set; }
}
public class PopVictim : IVictim
{
public string SharedProp { get; set; }
public string PopProperty { get; set; }
}
public class MyGenericVictim
{
//Optional Property
public bool? IsTroopVictim
{
get
{
if (Victim == null) return null;
return Victim.GetType() == typeof(TroopVictim);
}
}
public IVictim Victim { get; set; }
}
public class UseMyOfVictim
{
public void Bar()
{
Foo(new MyGenericVictim
{
Victim = new TroopVictim(),
});
}
public void Foo(MyGenericVictim myvic)
{
//Function doesnt know TroopVic or PopVic
TroopVictim resolvedTroopVic;
PopVictim resolvedPopVictim;
if (myvic.Victim.GetType() == typeof(TroopVictim))
{
resolvedTroopVic = (TroopVictim) myvic.Victim;
}
else if (myvic.Victim.GetType() == typeof(PopVictim))
{
resolvedPopVictim = (PopVictim) myvic.Victim;
}
string success = resolvedPopVictim.PopProperty;
success = resolvedTroopVic.TroopProperty;
}
}
您可以尝试使用
enum
,例如:enum受害者{team,Population}
。我知道,但我需要存储在对象中的额外信息。“名称”本身是不够的。您需要存储哪些额外的信息?基类应该是被害人
。从受害者那里获得部队
和人口
。您也可以尝试一下,我的主要要求是保留相关部队/人口对象的连接/外键。在这里,我只会创建新的,这对我的问题没有帮助。我想我只能让部队/人口从受害者那里继承。。或者我误解了什么?我的主要要求是保留相关部队/人口对象的连接/外键。在这里,我只会创建新的,这对我的问题没有帮助。我想我只能让部队/人口从受害者那里继承。。还是我误解了什么?
Console.WriteLine(weapon.Victims.Number)
public interface IVictim
{
string SharedProp { get; set; }
}
public class TroopVictim : IVictim
{
public string SharedProp { get; set; }
public string TroopProperty { get; set; }
}
public class PopVictim : IVictim
{
public string SharedProp { get; set; }
public string PopProperty { get; set; }
}
public class MyGenericVictim
{
//Optional Property
public bool? IsTroopVictim
{
get
{
if (Victim == null) return null;
return Victim.GetType() == typeof(TroopVictim);
}
}
public IVictim Victim { get; set; }
}
public class UseMyOfVictim
{
public void Bar()
{
Foo(new MyGenericVictim
{
Victim = new TroopVictim(),
});
}
public void Foo(MyGenericVictim myvic)
{
//Function doesnt know TroopVic or PopVic
TroopVictim resolvedTroopVic;
PopVictim resolvedPopVictim;
if (myvic.Victim.GetType() == typeof(TroopVictim))
{
resolvedTroopVic = (TroopVictim) myvic.Victim;
}
else if (myvic.Victim.GetType() == typeof(PopVictim))
{
resolvedPopVictim = (PopVictim) myvic.Victim;
}
string success = resolvedPopVictim.PopProperty;
success = resolvedTroopVic.TroopProperty;
}
}