当我有“虚拟/覆盖”时,我无法理解“受保护”的需要或目的,有人可以解释一下,如果它们几乎相同,我需要这两件事。
编辑:
感谢所有帮助者,我现在明白“受保护”仅用于可见性目的,而虚拟/覆盖用于类行为。
答案 0 :(得分:15)
他们肯定不几乎相同。
protected
修饰符设置字段或方法的可见性:这样的成员只能从其定义的类或派生类中访问。
virtual
修饰符指定在派生类中将其应用于can be overridden
的方法。
可以组合这些修饰符:可以保护方法和虚拟方法。
答案 1 :(得分:8)
使用某些代码而不是您可能已阅读的内容可能会更好,这里有一些您可以使用的示例。尝试删除注释(//),您可以看到编译器告诉您无法访问属性
[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");
}
}
答案 2 :(得分:2)
我认为你需要正确理解上述两件事,因为两者有不同的目的。
protected 是只能由同一类或结构中的代码或派生类中的代码访问的类型或成员。
虚拟关键字用于修改方法,属性并允许在派生类中重写它。
答案 3 :(得分:2)
我可以说, 最重要的 与virtual
的区别在于,这会导致编译器在多态调用方法成员时 将 实现绑定到已编译的代码。从客户端代码中调用类的成员时,对象的实际类型是派生类foo
,但是调用它的变量实际上是作为某个基类类型化(声明),比如说{ {1}},声明为bar
的成员将绑定到实际对象类型中的实现(或具有实现的对象类型的派生程度最大的基类)。声明为virtual的成员 not 将绑定到变量被声明为的类型的实现。
一个。的虚拟即可。然后,如果成员被声明为virtual,则即使将变量声明为基类型,也将执行派生类中的实现。
virtual
B中。 不虚拟。当不的成员声明为 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"
时,将根据声明的方法执行的变量类型选择实现。因此,如果你有一个Bird对象,在变量x中声明为`Animal',并且你调用一个在两个类中实现的方法,编译器将绑定到Animal类中的实现,而不是Bird,即使对象是真的是一只鸟。
virtual