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

Obs*_*rno 3 c# inheritance

我是继承人的新手.我注意到如果你从一个部分类中构造一个对象,并将它作为一个参数传递给一个接受它的基类型的函数,那么即使它们已经隐藏在部分类中,也会使用基本方法.

能够交替使用继承的对象会很有用.是否有一种解决方法或替代方法允许我以这种方式将对象作为参数传递?

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*NET 10

你做的继承都是错的.

首先; 你几乎应该使用方法隐藏.它没有很多实际用途.要允许派生对象覆盖基类功能(一种称为多态的概念),您可以在基类上使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Adr*_*ian 6

您的代码存在一些严重问题:

  1. partial 不做你的想法

    partial用于在多个地方(或
    文件)上拆分类声明.它与继承无关.

  2. 你应该使用virtual方法.

    声明基类中的方法,virtualoverride在派生类中使用.这些方法将只显示您想要的行为,即对方法的调用将取决于实例的类型而不是变量的静态类型:

    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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. new用于表示从派生类中的基类隐藏方法.只有在使用派生类的变量(静态调用)时才会调用该方法.