【问题标题】:C# how to get current class instance equivalent to self phpC#如何获取当前类实例等价于self php
【发布时间】:2013-01-17 22:14:54
【问题描述】:

假设我们有这些类:

class A {
    public string attr = "Class A";

    public static void getAttribute(){
         self currentClass = new self(); // equivalent to php
         Console.Write("Attribute : " + currentClass.attr);
    }
}

Class B : A {
    public string attr = "Class B";
}

B = new B();
B.getAttribute();

我希望 B.getAttribute(); 打印 Attribute: Class B。我该怎么做?

【问题讨论】:

  • .Net 成员名称应为 UpperCamelCase。

标签: c# oop inheritance polymorphism


【解决方案1】:

这基本上是不可能的。

B.getAttribute() 编译为A.getAttribute()

【讨论】:

  • 是解决这个问题的任何方法我知道 php 中的答案我只想要当前类实例
  • @AntonioPapa:不。你应该重新考虑你的设计;静态方法不应与派生类交互。
  • 好的,但如果它不是静态的,我该怎么做?
  • @AntonioPapa:通过使用 virtual 方法并覆盖它们。
【解决方案2】:

我可能知道你想要做什么,但我必须告诉你,这种 PHP 方法在 C# 中毫无意义。我不鼓励你使用它。

public class A
{
    private String attr = "Class A";

    public static String getAttribute()
    {
        return (new A()).attr;
    }
}

public class B : A
{
    private String attr = "Class B";

    public static String getAttribute()
    {
        return (new B()).attr;
    }
}

【讨论】:

  • 但是我怎样才能得到当前的类实例呢?
  • 发帖人的getAttribute()方法是静态的,不会起作用。静态成员不能被覆盖。
  • 显然,它不会像静态一样工作,但我认为发帖人从概念上询问如何使其在 C# 中工作。如果他需要将 getAttribute 设为静态,那么 getAttribute() 将需要将对象作为参数。
【解决方案3】:

您可以通过“this”关键字获取当前类实例。显然,您不能在静态方法中访问它,因为根据定义,静态方法在没有特定实例的上下文的情况下执行。

另一方面,要从同一个类中访问成员变量/属性/方法,您根本不需要 'this' 关键字,因为它是隐式的。

【讨论】:

    【解决方案4】:

    如果你问如何在 C# 中做类似的事情,我认为答案是这样的:

    public class A
    {
        public virtual string attr 
        {       
            get { return "Class A" }
        }
    
        public void getAttribute(){
             Console.Write("Attribute : " + attr);
        }
    }
    
    public class B : A
    {
        public override string attr 
        {       
            get { return "Class B"; }
        }
    }
    
    var b = new B();
    
    b.getAttribute();
    

    关于我在另一个答案中的评论,如果您需要 getAttribute 是静态的,您可以这样实现:

    public static void getAttribute(A obj){
         Console.Write("Attribute : " + obj.attr);
    }
    

    然后你可以这样称呼它:

    var b = new B();
    A.getAttribute(b);
    

    【讨论】:

    • 好的,谢谢,但我怎样才能获得当前类的实例?比如 currentClass.attr = "一些文字"
    • @AntonioPapa 我想你可能想看看this关键字msdn.microsoft.com/en-us/library/dk1507sz(v=vs.80).aspx
    • @AntonioPapa 你只要做 string val = this.attr;实际上,这是多余的,通常只是为了清楚起见。如果你在类的实例方法中,你可以像变量一样简单地使用 attr。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2022-08-20
    • 2021-02-23
    相关资源
    最近更新 更多