메서드 오버라이드
class Mammal{
public void Move(){
Console.WriteLine("이동한다.");
}
}
class Lion: Mammal{
public void Move(){
Console.WriteLine("네 발로 걷는다.");
}
}
class Whale : Mammal{
public void Move(){
Console.WriteLine("수영한다.");
}
}
class Human : Mamma{
public void Move(){
Console.WriteLine("두 발로 걷는다.");
}
}
암시적 형변환이 일어나면 원하는 결과가 안나옴
Lion lion = new Lion();
Mammal one = lion; // 부모타입으로 형변환
one.Move // 결과는 이동한다.
네발로 걸어야지 이동한다가 떠버림
원하는 건 네 발로 걷는다. => 가상메서드 사용
class Mammal{
virtual public void Move(){
Console.WriteLine("이동한다.");
}
}
class Lion: Mammal{
override public void Move(){
Console.WriteLine("네 발로 걷는다.");
}
}
class Whale : Mammal{
override public void Move(){
Console.WriteLine("수영한다.");
}
}
class Human : Mamma{
override public void Move(){
Console.WriteLine("두 발로 걷는다.");
}
}
그래서 가상 메서드 (virtual method)를 사용한다.
부모 메서드에 virtual 붙였음녀 자식 메서드는 override 붙는다. 강제사항은 아니지만 다형성 차원이 아니고 독립적인 하나의 메서드로 이름 정의해야 할 경우도 고려해야하낟. 그래서 new 예약어 제공
Lion lion = new Lion();
Mammal one = lion; // 부모타입으로 형변환
one.Move // 결과는 네 발로 이동한다.
컴파일 경고 없애려면 다음과 같이 정의
class Mammal{
new public void Move(){} // 구현 생략
}
class Lion: Mammal{
new public void Move(){} // 구현 생략
}
class Whale : Mammal{
new public void Move(){} // 구현 생략
}
class Human : Mamma{
new public void Move(){} // 구현 생략
}
메서드 오버로드
메서드는 시그니처(signature; 서명)가 있다.
메서드를 고유하게 규정할 수 있는 정보(이름, 매개변수의 수, 반환타입, 개별 매개변수 타입)를 의미한다.
반환값은 무시하고 이름만 같은 메서드가 매개변수의 수, 개별 매개변수 타입만 다르게 재정의되는 경우
생성자는 반환값이 없는 특수한 메서드로서 이것 역시 "매개변수의 수", "개별 매개변수 타입"만 다른 여러 가지 생성자를 정의함으로써 오버로드라고 불린다.
절대값을 구현할 때 메서드 오버로드가 없다면 다른 메서드 명을 지정해서 AbsDouble(double num) AbsInt(int num)등으로 각각 지정해야한다.
class Mathmetics{
public int Abs(int value){
return (value >=0)? value : -value;
}
public double Abs(double value){
return (value >=0)? value : -value;
}
public decimal Abs(decimal value){
return (value >=0)? value : -value;
}
}
이렇게 지정하면
Mathmetics math = new Mathmetics();
Console.WriteLine(math.Abs(-5));
Console.WriteLine(math.Abs(20.01m));
Console.WriteLine(math.Abs(-5.5555));
실행이 가능하다.
'IT > C#' 카테고리의 다른 글
| [c# 교육]day4 2 (0) | 2020.07.20 |
|---|---|
| [C#] 상속 (0) | 2020.07.10 |
| [C#] C# 클래스 확장 (0) | 2020.07.09 |
| [C#]인스턴스 (0) | 2020.07.08 |
| [ASP.NET]Base로 끝나는 클래스 (0) | 2020.07.08 |