gpt4 book ai didi

c# - 我的基本构造函数如何访问派生实例?

转载 作者:行者123 更新时间:2023-12-02 10:51:09 26 4
gpt4 key购买 nike

我有一个基类 Animal和派生类Lion .每只动物都应该提到丛林之王,它总是一头狮子。所以一个只读属性Lion : KingOfTheJungle在基类中添加。此属性在 Animal 中初始化的构造函数。

这个想法是首先创建 Lion对象,然后将它的引用传递给所有其他动物的构造函数。丛林只有一只狮子,所以当狮子被 build 时,应该承认自己是丛林之王。问题是我无法创建 Lion ,因为当我通过 this 时出现编译时错误作为 base() 的参数:

abstract class Animal
{
public Lion KingOfTheJungle { get; }

public Animal(Lion theKing)
{
KingOfTheJungle = theKing;
}
}

class Lion : Animal
{
public Lion() : base(this) // Error CS0027
{
}
}

我得到的错误是:

Error CS0027 Keyword 'this' is not available in the current context



寻找解决方法我最终通过了 null而不是 thisLion的构造函数,并插入 nullthisAnimal的构造函数:
abstract class Animal
{
public Lion KingOfTheJungle { get; }

public Animal(Lion theKing)
{
KingOfTheJungle = theKing ?? (Lion)this; // OK, but unsafe
}
}

class Lion : Animal
{
public Lion() : base(null) // OK, but not expressive
{
}
}

不过,我不喜欢这种解决方法,因为它既不具表现力,也不安全。有没有更安全或至少更优雅的方式来做同样的事情?

注:我想保留房产 KingOfTheJungle只读,没有 protected二传手。初始化后,动物不应更改此属性。

最佳答案

我建议KingOfTheJungle可能是 virtual (或 abstract )基类中的只读属性。然后在继承类中覆盖它。

类似于以下内容:

abstract class Animal
{
public abstract Lion KingOfTheJungle { get; }
}

class Lion : Animal
{
public override Lion KingOfTheJungle
{
get
{
return this;
}
}
}

关于c# - 我的基本构造函数如何访问派生实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58403237/

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