gpt4 book ai didi

c# - 动态转换 C#

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:37 25 4
gpt4 key购买 nike

我有父类 X 和父类 H。

H 在其字段数据中有一个对类型 X 的引用。H 的构造函数需要一个 X 类型的实例,然后将其存储在引用中。

然后我从 X 派生一个子类 x1,从 H 派生一个子类 h1。

h1 将在其构造函数中接受 X 或 x1 的实例。

但是尚未在其父类 X 中定义的 x1 的方法和属性将可用于 h1。

如何将 x1 永久转换为类 h1 中的 x1 类型?

最佳答案

让我们首先将问题重写为易于理解的内容。我们称它们为 Food 和 Animal,而不是 X 和 H。您的场景是:

abstract class Animal
{
protected Food favourite;
protected Animal(Food f) { this.favourite = f; }
}
abstract class Food
{
}
sealed class Banana : Food
{
public void Peel() {}
}
sealed class Monkey : Animal
{
public Monkey(Banana banana) : base(banana) {}
public PeelMyBanana()
{
this.favourite.Peel(); // Error, favourite is of type Food, not Banana
}
}

你的问题是:

How can I permanently make 'favourite' known to be of type 'Banana' inside 'Monkey'?

简短的回答是:你不能。该字段属于给定类型,可以包含对 Food 类型实例的任何引用。编译器和运行时不知道或不关心您碰巧知道对实际上将分配给该字段的事物类型的更严格限制。

有多种方法可以解决这个问题。您可以添加一个为您进行转换的访问器:

sealed class Monkey : Animal
{
public Monkey(Banana banana) : base(banana) {}

private Banana Favourite { get { return (Banana)this.favourite; } }

public PeelMyBanana()
{
this.Favourite.Peel(); // Works
}
}

或者您可以泛化基类:

abstract class Animal<F> where F : Food
{
protected F favourite;
protected Animal(F f) { this.favourite = f; }
}
abstract class Food
{
}
sealed class Banana : Food
{
public void Peel() {}
}
sealed class Monkey : Animal<Banana>
{
public Monkey(Banana banana) : base(banana) {}
public PeelMyBanana()
{
this.favourite.Peel(); // Legal; Animal<Banana>.favourite is of type Banana
}
}

关于c# - 动态转换 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com