new
와 virtual
/ 사이에는 차이가 있습니다 override
.
인스턴스화 될 때 클래스는 포인터의 테이블에 지나지 않으며 실제 메소드 구현을 가리 킵니다. 다음 이미지는 이것을 잘 시각화해야합니다.
이제 방법이 정의 될 수있는 여러 가지 방법이 있습니다. 상속과 함께 사용될 때 각각 다르게 동작합니다. 표준 방식은 항상 위의 그림과 같이 작동합니다. 이 동작을 변경하려면 다른 키워드를 분석법에 첨부 할 수 있습니다.
1. 추상 수업
첫 번째는 abstract
입니다. abstract
방법은 단순히 아무데도 가리지 않습니다.
클래스에 추상 멤버가 포함 된 경우으로 표시 abstract
해야합니다. 그렇지 않으면 컴파일러가 애플리케이션을 컴파일하지 않습니다. abstract
클래스의 인스턴스를 작성할 수는 없지만 클래스에서 상속하고 상속 된 클래스의 인스턴스를 작성하고 기본 클래스 정의를 사용하여 액세스 할 수 있습니다. 귀하의 예에서 이것은 다음과 같습니다.
public abstract class Person
{
public abstract void ShowInfo();
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
public class Student : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a student!");
}
}
호출되면 ShowInfo
구현에 따라 동작이 달라집니다.
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a student!'
둘, Student
S와 Teacher
S는 Person
S,하지만 그들은 자신에 대해 프롬프트 정보를 묻는 메시지가 나타나면 서로 다른 동작합니다. 그러나 정보를 묻도록 요청하는 방법은 동일합니다. Person
클래스 인터페이스 사용.
그래서 당신이 상속 할 때 무대 뒤에서 어떻게됩니까 Person
? 구현할 때 ShowInfo
포인터가 더 이상 아무 것도 가리 키지 않고 이제 실제 구현을 가리 킵니다. Student
인스턴스를 만들 때 Student
s를 가리 킵니다 ShowInfo
.
2. 가상 방법
두 번째 방법은 방법을 사용 virtual
하는 것입니다. 기본 클래스에서 선택적 기본 구현을 제공한다는 점을 제외하면 동작은 동일 합니다. 와 클래스 virtual
멤버를 통해 인스턴스 할 수 있지만 상속 된 클래스는 다른 구현을 제공 할 수 있습니다. 코드가 실제로 작동하는 모습은 다음과 같습니다.
public class Person
{
public virtual void ShowInfo()
{
Console.WriteLine("I am a person!");
}
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
주요 차이점은 기본 멤버 Person.ShowInfo
가 더 이상 아무 것도 가리 키지 않는다는 것입니다. 이것이 또한 인스턴스를 작성할 수있는 이유이기도합니다 Person
(따라서 abstract
더 이상 표시 하지 않아도 됨).
이것은 현재 첫 번째 이미지와 다르지 않습니다. 그 이유는 virtual
메소드가 " 표준 방식 " 구현을 가리키고 있기 때문 입니다. 사용하여 virtual
, 당신은 말할 수 Persons
그들은 것을, 수 (안 한다 에 대해 서로 다른 구현을 제공) ShowInfo
. 위와 override
같이 다른 구현 (을 사용하여 ) 을 제공 Teacher
하면 이미지는와 동일하게 보입니다 abstract
. Student
s에 대한 사용자 정의 구현을 제공하지 않았다고 상상해보십시오 .
public class Student : Person
{
}
코드는 다음과 같이 호출됩니다.
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a person!'
그리고 이미지 Student
는 다음과 같습니다.
3. 마법의 '새로운'키워드 (일명 "그림자")
new
이 주위에 더 많은 해킹입니다. 기본 클래스 / 인터페이스의 메소드와 이름이 같은 일반화 된 클래스의 메소드를 제공 할 수 있습니다. 둘 다 자신의 사용자 정의 구현을 가리 킵니다.
구현은 제공 한 것과 유사합니다. 메소드에 액세스하는 방식에 따라 동작이 다릅니다.
Teacher teacher = new Teacher();
Person person = (Person)teacher;
teacher.ShowInfo(); // Prints 'I am a teacher!'
person.ShowInfo(); // Prints 'I am a person!'
이 동작을 원할 수는 있지만 오해의 소지가 있습니다.
이것이 당신을 위해 이해하기 쉽기를 바랍니다!