using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LearnOverride
{
class Program
{
static void Main(string[] args)
{
Owner owner = new Owner();
Safe safe = new Safe();
Console.WriteLine("When \tLocksmith locksmith = new Locksmith();\n");
Locksmith locksmith = new Locksmith();
locksmith.OpenSafe(safe, owner);
Console.WriteLine("when ReturnContents() called from main,");
Jewels openedLocksmith = safe.Open("12345");
locksmith.ReturnContents(openedLocksmith, owner);
Console.WriteLine();
Console.WriteLine("\n\nWhen \tJewelThief jewelThief = new JewelThief();\n");
JewelThief jewelThief = new JewelThief();
jewelThief.OpenSafe(safe, owner);
Console.WriteLine("when ReturnContents() called from main,");
Jewels opened = safe.Open("12345");
jewelThief.ReturnContents(opened, owner);
Console.WriteLine();
Console.WriteLine("\n\nWhen \tLocksmith jewelThiefAsLocksmith = new JewelThief();\n");
Locksmith jewelThiefAsLocksmith = new JewelThief();
jewelThiefAsLocksmith.OpenSafe(safe, owner);
Console.WriteLine("when ReturnContents() called from main,");
Jewels j = safe.Open("12345");
jewelThiefAsLocksmith.ReturnContents(j, owner);
///JewelThief jewelThief = new Locksmith(); is error
Console.ReadKey();
}
}
class Jewels
{
public string Sparkle()
{
return "Sparkle, sparkle!";
}
}
class Safe
{
private Jewels contents = new Jewels();
private string safeCombination = "12345";
public Jewels Open(string combination)
{
if (combination == safeCombination)
return contents;
else
return null;
}
public void PickLock(Locksmith lockpicker)
{
lockpicker.WriteDownCombination(safeCombination);
}
}
class Owner
{
private Jewels returnedContents;
public void ReceiveContents(Jewels safeContents)
{
returnedContents = safeContents;
Console.WriteLine("Owner:Thank you for returning my jewels! " + safeContents.Sparkle());
}
}
class Locksmith
{
public void OpenSafe(Safe safe, Owner owner)
{
safe.PickLock(this);
Jewels safeContents = safe.Open(writtenDownCombination);
this.ReturnContents(safeContents, owner);
}
private string writtenDownCombination = null;
public void WriteDownCombination(string combination)
{
writtenDownCombination = combination;
}
public void ReturnContents(Jewels safeContents, Owner owner)
{
owner.ReceiveContents(safeContents);
}
}
class JewelThief : Locksmith
{
private Jewels stolenJewels = null;
public void ReturnContents(Jewels safeContents, Owner owner)
{
stolenJewels = safeContents;
Console.WriteLine("JewelThief:I'm stealing the contents! " + stolenJewels.Sparkle());
}
}
}
위 코드는 메서드 ReturnContents()를 재정의하지 않습니다. 그것은 숨어 있습니다. 그래서 나는 기대하고 있었다 성명기본 클래스에있는 메서드 숨기기
this.ReturnContents (safeContents, owner);
(OpenSafe() 메소드 내부에 있음), 객체 'JewelThief'에서 참조하는 경우 ReturnContents() 메소드가 현재 Jewelthief 객체를 호출합니다.
하지만 항상 기본 클래스 메소드 인 ReturnContents를 호출합니다. 이 행동은 어떻게 설명됩니까?
있는지 아니
new
연산자를 사용하여 당신이 그것을 숨길 수있는 방법을Override
싶지 않다합니다. – TalentTuner'virtual-override'를 사용할 수 있다는 것을 알고 있습니다. 그러나 방법을 숨길 때 그 행동을 배우고있었습니다. – SHRI
이 또한 숨어 있지 않습니다. 재정의 된 메서드에 새 키워드를 사용해야합니다. – TalentTuner