传递已经启动的基类实例?

时间:2018-03-24 09:26:00

标签: c# .net

我有一个继承另一个类作为其基类的类,所以就像。

class Player : PlayerData
{
    public Player(IChannelHandlerContext context) : base()
    {
    }
}

当启动类Player时,有没有办法可以为类创建我已经创建的PlayerData实例?创建一个然后必须再次创建它似乎是浪费?

5 个答案:

答案 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)

您所描述的内容称为向下转换,它不能通过实例化基本类型完成更具体的类型。但是你可以:

  1. 将其作为构造函数参数传递并复制基本属性
  2. 使用方法,或者如果您真的提交反射来复制基本属性
  3. 或者,如果你真的想要走下这个兔子洞,你可以使用 Automapper 创建并映射到你的新派生类型(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实例上声明任何值属性。