代码之家  ›  专栏  ›  技术社区  ›  Arashv

访问PropertChangedCallback中的私有方法的非常奇怪的行为

  •  1
  • Arashv  · 技术社区  · 10 年前

    好啊我只是出于好奇才这么问,因为这对我来说很奇怪。

    为了便于讨论,让我们假设我定义了 DependencyProperty 和一个 private 名为的类中的方法 DynamicGridControl 这样地:

    public static readonly DependencyProperty ZoomFactorProperty =
        DependencyProperty.Register("ZoomFactor", typeof(double), typeof(DynamicGridControl), new UIPropertyMetadata(1.0, new PropertyChangedCallback(OnZoomFactorPropertyChanged)));
    
    ...
    
    private void forceAdornerRender()
    {
        //Do Something
    }
    

    当然,我有一个 static 类中的事件处理程序,如下所示:

    private static void OnZoomFactorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var vm = (DynamicGridControl)d;
        if (vm != null)
        {
            vm.forceAdornerRender();
        }
    }
    

    问题是,为什么我能够在没有任何错误或警告的情况下编译这段代码?!我正在访问 私有方法 当然,我不应该被允许。我有什么遗漏吗?OOP中有我不知道的规则吗?

    提前感谢。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Jay    10 年前

    可以 通道 private 同一类实例上的成员,甚至在 static 成员。

    访问同一类的另一个实例上的私有成员的能力在实现 IEquatable<T> , IComparable<T> ,

    public class ClassA : IEquatable<ClassA>
    {
      private int _value;
    
      public bool Equals(ClassA other)
      {
        return _value == other._value;
      }
    }
    

    从访问 静止的 s专门用于运算符:

    public class ClassA 
    {
      private string _value;
    
      public ClassA(string value)
      {
        _value = value;
      }
    
      public static ClassA operator +(ClassA first, ClassA second)
      {
        return new ClassA(first._value + second._value);
      }
    
      public static implicit operator string(ClassA a)
      {
        return a._value;
      }
    }
    

    相关花絮:您可以访问 私有的 来自嵌套类的外部类的成员。

    public class ClassA
    {
         private string _foo = "foo";
    
         private class ClassB
         {
              public string Bar(ClassA a)
              {
                    return a._foo;
              }
    
         }
    }
    

    问题是:这是否违反了OOP?
    我真的看不出来。A. 私有的 成员意味着它可以从类中访问,在所有这些示例中,它都是从同一个类中访问的。我认为如果没有这个特性,破坏封装和降低内聚性的风险会更大,因为在某些情况下,我们将被迫公开比给定模型所需的更多特定于实现的信息。

        2
  •  0
  •   Nathan A    10 年前

    类的静态成员仍然可以访问同一类的私有实例方法,假设您有对该实例的引用。

    例如,以下功能很好:

    class TestClass
    {
        public static void TestStaticMethod()
        {
            TestClass instance = new TestClass();
    
            instance.PrivateMethod();
        }
    
        private void PrivateMethod()
        { 
            //Do Something
        }
    }