我有一个继承另一个类作为其基类的类,所以就像。
class Player : PlayerData
{
public Player(IChannelHandlerContext context) : base()
{
}
}
当启动类Player
时,有没有办法可以为类创建我已经创建的PlayerData实例?创建一个然后必须再次创建它似乎是浪费?
答案 0 :(得分:3)
将其作为构造函数中的参数传递。
PlayerData pd = new PlayerData();
Player p = new Player(chanelHandlerContext, pd);
如果那是你的意思。如果您希望Player实例已经使用基类实例中的属性值填充,则最好使用Automapper。
试试这个,工作正常:
static void Main(string[] args)
{
PlayerData pd = new PlayerData();
IChannelHandlerContext chanelHandlerContext = new ChannelHandlerContext();
Player p = new Player(chanelHandlerContext, pd);
Console.WriteLine(p);
}
interface IChannelHandlerContext
{
}
class ChannelHandlerContext : IChannelHandlerContext
{
}
class PlayerData
{
}
class Player : PlayerData
{
public Player(IChannelHandlerContext context, PlayerData pd) : base()
{
}
}
这种方式也可以正常工作:
class PlayerData
{
public PlayerData()
{
}
public PlayerData(PlayerData pd)
{
}
}
class Player : PlayerData
{
public Player(IChannelHandlerContext context, PlayerData pd) : base(pd)
{
}
}
答案 1 :(得分:0)
您所描述的内容称为向下转换,它不能通过实例化基本类型完成更具体的类型。但是你可以:
Player
)答案 2 :(得分:0)
您可以将<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="process.php" id="myform" method="post" accept-charset="utf-8">
<input type="text" name="name" placeholder="Your Name" >
<input type="email" name="email" placeholder="Your Email" >
<input type="submit" value="submit" />
</form>
的实例作为PlayerData
的构造函数的参数。如果您的基类具有复制构造函数,则可以将该参数传递给基础构造函数。
Player
其他解决方案不是从class PlayerData
{
public int _dataParameter;
public PlayerData(int parameter)
{
_dataParameter = parameter;
}
protected PlayerData(PlayerData pd)
{
_dataParameter = pd._dataParameter;
}
}
class Player : PlayerData
{
public int _playerParameter;
public Player(int a, PlayerData pd) : base(pd)
{
_playerParameter = a;
}
}
class Program
{
static void Main(string[] args)
{
var pd = new PlayerData(1);
var p = new Player(2, pd);
Console.WriteLine("Player {0}, base {1}", p._playerParameter, p._dataParameter);
Console.ReadKey();
}
}
派生,而是在PlayerData
对象中保留PlayerData
的实例(组合而不是继承)。
答案 3 :(得分:0)
回答您的具体问题 -
传递已经启动的基类实例?
否即可。创建Player
类型的实例意味着首先创建基类型的实例,即PlayerData
,并且是非隔离操作单元。
答案 4 :(得分:0)
这是我的建议,将基类的实例传递给派生类,不仅继承属性,还包括值:
public class PlayerData
{
public int PlayerID { get; set; }
}
public class Player : PlayerData
{
public Player(PlayerData pd) : base()
{
this.PlayerID = pd.PlayerID;
}
}
然后,无论何时声明派生类,都要传递要继承的基类:
PlayerData pd = new PlayerData()
{
PlayerID = 1
};
Player p = new Player(pd);
然后是:
的值p.PlayerID
也是1.不使用在Player实例上声明任何值属性。