【问题标题】:Reaching public property of parent class达到父类的公共属性
【发布时间】:2013-06-17 02:17:03
【问题描述】:

一个简单的问题:

public class class1
{
     public string string1;
     public class class2
     {
         public string string2
         {
             get{ string tmp = class1.string1;  } 
         }
     }

}

我希望能够从 class2.string2.get 到达 class1.string1,但我做不到。你会建议我改变什么,以便我可以做到这一点?

感谢

【问题讨论】:

  • 如果您希望以 class1.string1 的形式访问它,您将需要一个静态值。否则,您需要在 class2 中有对 class1 对象的引用。在初始化 class2 时,是否可以添加一个引用作为 class1 的构造函数参数之一?
  • @Sander 因为这是正确的答案,您应该将其作为答案发布:) 添加一些详细说明,超类和子类之间可能存在一对多关系,这就是为什么不能根据定义,t 是直接映射。
  • 请您在问题中更好地解释您如何在主类中使用内部类?是 string1 static?
  • class2 未初始化。它在函数中用作 class1 中的类型,例如:GetQueryable() .Where(..)
  • @NielsKeurentjes 我想我现在为时已晚 :)

标签: c# class oop public


【解决方案1】:

在构造函数中将 class1 引用传递给 class2:

public class class1 {
  public string string1;
  public class class2 {
    private class1 _Reference;
    public class2(class1 reference) {
      if (reference == null) {
        throw new ArgumentNullException("reference");
      }
      _Reference = reference;
    }
    public string string2 {
      get { return _Reference.string1; }
    }
  }

}

在创建两个类后将 class1 引用传递给 class2:

public class class1 {
  public string string1;
  public class class2 {
    private class1 _Reference;

    public class1 Reference {
      set { _Reference = value; }
    }

    public string string2 {
      get { return _Reference.string1; }
    }
  }

}

static void usage() {
  var foo = new class1();
  var bar = new class1.class2();
  bar.Reference = foo;
  string value = bar.string2;
}

【讨论】:

  • 感谢您的解决方案。但问题是class2没有在class1中初始化。它仅用于以下方法: Context.GetQueryable() .Where(..) 。所以永远不会为 class2 调用构造函数!
  • 我想我需要一个静态全局类。
  • 也许可以通过您想如何使用它来增强您的问题? :)
【解决方案2】:

据我所知,无法从嵌套类中访问类。类嵌套不会导致周围类的自动实例化,它只是一种(通常相当臭的)结构化代码的方法。

您需要在 Class2 中引用 Class1 的实际实例,或者需要 Class1 上的静态方法。

实现此目的的另一种方法是使用继承,但这是完全不同的野兽:

public class Class1 {
    protected String String1 { get; set; }
}

public class Class2 : Class1 {
    public String String2 {
        get {
            String PropertyFromClass1 = base.String1;
            // ...
        }
    }
}

也就是说:您的代码无法编译,string2 的 getter 不会返回任何内容。请熟悉C#'s naming conventions

【讨论】:

    【解决方案3】:

    感谢您的建议。由于代码的特殊性,我不得不使用另一个命名空间中的全局公共静态类来解决这种情况。

    【讨论】:

      【解决方案4】:

      来自 Java,当我开始使用 C# 进行开发时,我遇到了这个“问题”。

      正如Dennis Traubthis C# 文章中明确解释的那样,您无法访问外部类成员或方法。所以你必须实现 Java 中自动发生的事情:

      class OuterClass {
          string s;
          // ...
          class InnerClass {
              OuterClass o_;
              public InnerClass(OuterClass o) { o_ = o; }
      
              public string GetOuterString() { return o_.s; }
              }
      
          void SomeFunction() {
              InnerClass i = new InnerClass(this);
              i.GetOuterString();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 2011-09-06
        • 2011-01-02
        • 1970-01-01
        相关资源
        最近更新 更多