【问题标题】:Difference between "protected" and "virtual/override"“受保护”和“虚拟/覆盖”之间的区别
【发布时间】:2012-10-30 18:40:58
【问题描述】:

当我有“虚拟/覆盖”时,我无法理解“受保护”的需要或目的,如果它们几乎相同,有人可以解释一下我需要什么。

编辑:

感谢所有帮助者,我现在明白“受保护”仅用于可见性目的,而虚拟/覆盖用于类行为。

【问题讨论】:

  • 这些概念有些无关。一个指定可见性,另一个指定多态行为。你在比较苹果和橘子。
  • @AntLaC 你错了,这是新的 vs 覆盖是不同的
  • @Antlac 那不是一回事

标签: c# oop


【解决方案1】:

它们肯定几乎相同。

protected 修饰符设置字段或方法的可见性:此类成员只能从定义它的类或派生类访问。

virtual 修饰符指定它应用于派生类中can be overridden 的方法。

这些修饰符可以组合使用:方法可以是受保护的和虚拟的。

【讨论】:

  • 这个答案只描述了它如何影响/限制语法,而不是功能含义,或者何时/为什么应该使用每个。
  • 是的,你是对的......我对 Java 感到困惑。我最近经常来回切换。先生,您有我谦卑的歉意。您将不得不以某种方式编辑答案...所以不允许我撤消我的否决票
【解决方案2】:
  • protected 表示当前类和派生类私有
  • virtual 表示它可以按原样使用,也可以在派生类中被覆盖

也许使用一些代码而不是你可能已经阅读过的东西会更好,这里有一个你可以玩的小示例。试试去掉cmets(//),可以看到编译器告诉你属性不能访问

[TestFixture]
public class NewTest
{
    [Test]
    public void WhatGetsPrinted()
    {
        A a= new B();
        a.Print();  //This uses B's Print method since it overrides A's
        // a.ProtectedProperty is not accesible here
    }
}

public class A
{
    protected string ProtectedProperty { get; set; }

    private string PrivateProperty { get; set; }

    public virtual void Print()
    {
        Console.WriteLine("A");
    }
}

public class B : A
{
    public override void  Print() // Since Print is marked virtual in the base class we can override it here
    {
        //base.PrivateProperty can not be accessed hhere since it is private
        base.ProtectedProperty = "ProtectedProperty can be accessed here since it is protected and B:A";
        Console.WriteLine("B");
    }
}

【讨论】:

    【解决方案3】:

    我可以说,关于virtual最重要的区别在于,这会导致编译器在多态调用方法成员时,哪个实现将编译后的代码绑定到。当您从对象的实际类型所在的客户端代码调用类的成员时,例如派生类foo,但它被调用的变量实际上是类型(声明)为某个基类,例如bar , 声明为virtual 的成员将绑定到实际对象类型中的实现,(或绑定到具有实现的对象类型的最派生基类)。 not 声明为 virtual 的成员将绑定到 variable 声明为的类型中的实现。

    A. 虚拟。那么,如果该成员被声明为虚拟,即使该变量被声明为基类型,派生类中的实现也会被执行。

      public class Animal
      { public virtual Move() { debug.Print("Animal.Move()"); }
      public class Bird: Animal
      { public virtual override Move() { debug.Print("Bird.Move()");  }
      Animal x = new Bird();  
      x.Move();   // Will print "Bird.Move"
    

    B. 非虚拟。当not 声明为virtual 的成员时,将根据执行该方法的变量的声明类型来选择实现。因此,如果您有一个 Bird 对象,在变量 x 中声明为“Animal”,并且您调用在两个类中都实现的方法,编译器将绑定到 Animal 类中的实现,而不是 Bird,即使该对象是真的是一只鸟。

      public class Animal
      { public Move() { debug.Print("Animal.Move()"); }
      public class Bird: Animal
      { public Move() { debug.Print("Bird.Move()");  }
      Animal x = new Bird();  
      x.Move();   // Will print "Animal.Move"
    

    【讨论】:

      【解决方案4】:

      我认为你需要正确理解以上两件事,因为两者有不同的目的。

      protected 是类型或成员只能由同一类或结构中的代码或派生类中的代码访问。

      virtual 关键字用于修改方法、属性并允许其在派生类中被覆盖。

      【讨论】:

        猜你喜欢
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 2012-04-03
        • 2019-01-25
        • 2011-06-01
        • 1970-01-01
        • 2010-11-26
        相关资源
        最近更新 更多