gpt4 book ai didi

c# - 有没有办法像 python 一样在 C# 中制作类方法?

转载 作者:行者123 更新时间:2023-11-30 22:36:14 28 4
gpt4 key购买 nike

在python中,实例方法self指向类实例,就像C#中的this一样。在python中,一个类方法self指向类。是否有 C# 等效项?

这很有用,例如:

Python 示例:

class A:
values = [1,2]

@classmethod
def Foo(self):
print "Foo called in class: ", self, self.values

@staticmethod
def Bar():
print "Same for all classes - there is no self"

class B(A):
# other code specific to class B
values = [1,2,3]
pass

class C(A):
# other code specific to class C
values = [1,2,3,4,5]
pass

A.Foo()
A.Bar()
B.Foo()
B.Bar()
C.Foo()
C.Bar()

结果:

Foo called in class:  __main__.A [1, 2]
Same for all classes - there is no self
Foo called in class: __main__.B [1, 2, 3]
Same for all classes - there is no self
Foo called in class: __main__.C [1, 2, 3, 4, 5]
Same for all classes - there is no self

这可能是一个很好的工具,因此类上下文中的公共(public)代码(没有实例)可以提供由子类定义的自定义行为(不需要子类的实例)。

在我看来,C# 静态方法与 python 静态方法完全一样,因为无法访问实际使用哪个类来调用该方法。

但有没有办法在 C# 中执行类方法?或者至少确定哪个类调用了方法,例如:

public class A
{
public static List<int> values;

public static Foo()
{
Console.WriteLine("How can I figure out which class called this method?");
}
}

public class B : A
{
}

public class C : A
{
}

public class Program
{
public static void Main()
{
A.Foo();
B.Foo();
C.Foo();
}
}

最佳答案

使用常规静态方法无法做到这一点。可能的替代方案包括:

1) 虚拟的、重写的实例方法:

public class A
{
public virtual void Foo()
{
Console.WriteLine("Called from A");
}
}

public class B : A
{
public override void Foo()
{
Console.WriteLine("Called from B");
}
}

2)扩展方法:

public class A
{
}

public class B : A
{
}

public static class Extensions
{
/// Allows you to do:
/// var whoop = new B();
/// whoop.Foo();
public static void Foo<T>(this T thing) where T : A
{
Console.WriteLine("Called from " + thing.GetType().Name);
}
}

3) 假设 A 和 B 有一个默认的构造函数:

public static class Cached<T> where T : class, new()
{
private static T _cachedInstance;

public static T Instance
{
get { return _cachedInstance ?? (_cachedInstance = new T()); }
}
}

public static class Extensions
{
public static void Example()
{
Cached<B>.Instance.Foo();
}

public static void Foo<T>(this T thing) where T : A, new()
{
Console.WriteLine("Called from " + typeof(T).Name);
}
}

关于c# - 有没有办法像 python 一样在 C# 中制作类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7115661/

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