gpt4 book ai didi

C#:对象作为参数传递时使用的隐藏基方法。任何解决方法?

转载 作者:行者123 更新时间:2023-11-30 13:14:33 24 4
gpt4 key购买 nike

我是继承新手。我注意到,如果您获取一个从分部类构造的对象,并将其作为参数传递给接受其基类型的函数,即使基方法已隐藏在分部类中,也会使用这些方法。

能够互换地使用继承的对象会很有用。语言中是否存在允许我以这种方式将对象作为参数传递的变通方法或替代方法?

我写了一些示例代码来演示我在说什么:

public class Enemy
{
string[] baseLikes = new string[] { "loitering", "puppies" };

public string[] GetLikes()
{
return baseLikes;
}
}

public partial class Skater : Enemy
{
string[] uniqueLikes = new string[] { "skateboarding" };

public new string[] GetLikes()
{
string[] likes = base.GetLikes();
return likes.Concat(uniqueLikes).ToArray();
}
}

class Program
{
public static void WriteEnemyLikes(Enemy enemy)
{
string[] likes = enemy.GetLikes();
Console.WriteLine("This enemy's likes: ");
foreach (string like in likes)
Console.WriteLine("- " + like);
}

static void Main(string[] args)
{
Skater skater = new Skater();
WriteEnemyLikes(skater);

Console.ReadLine();

// Output:
// This enemy's likes:
// - loitering
// - puppies

// Notably absent: skateboarding
}
}

最佳答案

你做的继承是错误的。

首先;你几乎应该永远不要使用方法隐藏。它只是没有太多实际用途。要允许派生对象覆盖基类功能(称为多态性的概念),您可以在基类上使用override 关键字和virtual:

public class Enemy
{
string[] baseLikes = new string[] { "loitering", "puppies" };

public virtual string[] GetLikes()
{
return baseLikes;
}
}

public class Skater : Enemy
{
string[] uniqueLikes = new string[] { "skateboarding" };

public override string[] GetLikes()
{
string[] likes = base.GetLikes();
return likes.Concat(uniqueLikes).ToArray();
}
}

如果您仍想在派生类中使用基类方法,请使用base() 调用它。派生类也没有理由是 partial 除非您希望在另一个文件中定义它的另一部分。 partial 类的真正原因是生成的代码,而这并没有发生在这里。

关于C#:对象作为参数传递时使用的隐藏基方法。任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44660774/

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