任何人都可以在内存和引用方面告诉覆盖和隐藏的工作.
class A
{
public virtual void Test1() { //Impl 1}
public virtual void Test2() { //Impl 2}
}
class B : A
{
public override void Test1() { //Impl 3}
public new void Test2() { Impl 4}
}
static Main()
{
A aa=new B() //This will give memory to B
aa.Test1(); //What happens in terms of memory when this executes
aa.Test2(); //-----------------------SAME------------------------
}
Run Code Online (Sandbox Code Playgroud)
这里的内存是B类,但在第二个语句中,将调用aa.Test2类A的方法.为什么?如果B有内存,则应调用B的方法(在我看来).
任何非常深刻和完全描述这一基础的链接/练习将是一个很大的帮助.
我有以下课程:
namespace ConsoleApplication8
{
public abstract class Employee
{
public virtual void Show()
{
Console.WriteLine("from base.");
}
}
public class Manager:Employee
{
public void Show()
{
Console.WriteLine("from child.");
}
}
class Program
{
static void Main(string[] args)
{
var man=new Manager();
man.Show();
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里我没有override为Show()派生类中的方法使用任何关键字,Manager但代码运行正常.那么override关键字的实际用途是什么?
我只有一个基本问题:
public class virtualTest
{
public virtual void vTest()
{
Console.WriteLine("Base Class");
}
}
public class derivedVirtualTest : virtualTest
{
public override void vTest()
{
Console.WriteLine("Derived Class");
}
}
Run Code Online (Sandbox Code Playgroud)
这里我使用函数覆盖函数vTest()
但如果我:
public class virtualTest
{
public void vTest()
{
Console.WriteLine("Base Class");
}
}
public class derivedVirtualTest : virtualTest
{
public void vTest()
{
Console.WriteLine("Derived Class");
}
}
Run Code Online (Sandbox Code Playgroud)
从相应位置删除虚拟和覆盖关键字,然后代码工作.
这怎么可能?
或者如果代码在没有虚拟和覆盖的情况下正常工作,那么覆盖和虚拟(整个函数覆盖)的用途是什么?
编辑:
我通过它调用上面的类的方法
static void Main(string[] args)
{
derivedVirtualTest objderivedVirtualTest = new derivedVirtualTest();
objderivedVirtualTest.vTest();
virtualTest objvirtualTest = new virtualTest();
objvirtualTest.vTest();
Console.ReadLine(); …Run Code Online (Sandbox Code Playgroud) 我对C#很新,所以我希望如果我的问题听起来很愚蠢请原谅我的无知.
-我尝试Inheritance用丰达C#,发现它在一些奇怪的行为方式,所以我想用检查出来Java,我得到了我的预期的结果.
-我只是想知道这里有什么我想念的.......
C#代码:
class Animal
{
public void Sound()
{
System.Console.WriteLine("I don't make any sound");
}
}
class Dog : Animal
{
public void Sound()
{
System.Console.WriteLine("barking");
}
}
class InheritTest
{
static void Main()
{
Animal a = new Dog(); // Implicit conversion
Dog d = (Dog) a; // Explicit conversion
a.Sound();
d.Sound();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
I don't make any sound
barking
Run Code Online (Sandbox Code Playgroud)
JAVA代码:
class Animal
{
public void sound()
{ …Run Code Online (Sandbox Code Playgroud)