gpt4 book ai didi

c# - 静态方法如何调用虚方法?

转载 作者:行者123 更新时间:2023-11-30 19:35:58 25 4
gpt4 key购买 nike

在为自定义对象编写自己的相等逻辑时,可以做一些事情。其中两种做法包括重载 == 运算符和覆盖 obj.Equals() 方法。下面,我们只对父类 Animal 和子类 Hominoidea 执行此操作。

public class Animal
{
public static bool operator ==(Animal x, Animal y)
{
return object.Equals(x, y);
}

public override bool Equals(object obj)
{ ... }

...
}

public class Hominoidea : Animal
{
public static bool operator ==(Hominoidea x, Hominoidea y)
{
return object.Equals(x, y);
}

public override bool Equals(object obj)
{ ... }

...
}

在这种情况下,我们能够轻松地比较动物的一种方式,而不管它们的派生类(人科、猫科等),我们会利用基类的简单逻辑,也许会写一些类似的东西:

static void DisplayWhetherEqual(Animal animal1, Animal animal2)
{
if (animal1 == animal2)
{
Console.WriteLine(string.Format("{0,12} == {1}", animal1, animal2));
}
else
Console.WriteLine(string.Format("{0,12} != {1}", animal1, animal2));
}

如果我们传入 Hominoidea 对象,代码将首先为 Animal 执行 static 重载 == > 类,然后为子类 Hominoidea 类执行虚拟 object.Equals(x, y)

当将这两个 Hominoidea 类作为 Animal 进行比较时,编译器如何调用正确的虚拟 object.Equals() static 运算符方法中的方法? 我认为 static 方法中的所有内容也必须是 static

最佳答案

静态方法当然可以访问实例方法;没有它们,您将无法做任何非常有趣的事情。静态类缺少的是它自己的实例(关键字 this 在静态方法中是未定义的)。但是您可以在传递给它或以其他方式可用的任何对象上调用实例方法。

所以虽然你不能这样做

class MyClass
{
static void Print()
{
Console.WriteLine(this.ToString()); //Does not compile
}
}

你肯定能做到这一点

class MyClass
{
static void Print(MyClass instance)
{
Console.WriteLine(instance.ToString()); //Compiles, because it references an object that was passed in
}
}

还有这个

class MyClass
{
static private MyClass _anInstance = new MyClass();

static void Print()
{
Console.WriteLine(_anInstance.ToString()); //Compiles, because it references an object instance held in a static variable
}
}

关于c# - 静态方法如何调用虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49502856/

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