클래스 상속
- 클래스는 다른 클래스로부터 상속받을 수 있다.
- 객체지향에서는 자식 클래스가 부모 클래스 지정
- 형식
class 기반클래스
{
}
class 파생클래스 : 기반클래스
{
}
using System;
namespace Inheritance
{
class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
Console.WriteLine($"{this.Name}.Base()");
}
~Base()
{
Console.WriteLine($"{this.Name}.~Base()");
}
public void BaseMethod()
{
Console.WriteLine($"{Name}.BaseMethod()");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
{
Console.WriteLine($"{this.Name}.Derived()");
}
~Derived()
{
Console.WriteLine($"{this.Name}.~Derived()");
}
public void DerivedMethod()
{
Console.WriteLine($"{Name}.DerivedMethod()");
}
}
class MainApp
{
static void Main(string[] args)
{
Base a = new Base("a");
a.BaseMethod();
Derived b = new Derived("b");
b.BaseMethod();
b.DerivedMethod();
}
}
}
- 상속이나 자식 클래스 구현을 막기 위해 상속이 불가능하게 하는 sealed 한정자 이용
- 형식
sealed class Base
{
}
clase Derived : Base
{
}
부모 클래스와 자식 클래스 사이의 형식 변환, is, as
- 개, 고양이는 포유류라는 공통점이 있으므로 같은 부모클래스 가짐
class Mammal
{
public void Nurse(){}
}
class Dog : Mammal
{
public void Bark(){}
}
class Cat : Mammal
{
public void Meow{}
}
Mammal mammal= new Mammal();
mammal.Nurse()
Dog dog = new Dog();
dog.Nurse();
dog.Bark();
Cat cat = new Cat();
cat.Nurse();
cat.Meow();
Mammal mammal= new Mammal();
mammal.Nurse()
mammal = new Dog();
mammal.Nurse();
Dog dog = (Dog)mammal;
dog.Nurse();
dog.Bark();
mammal = new Cat();
mammal.Nurse();
Cat cat = (Cat)mammal;
cat.Nurse();
cat.Meow();
- Mammal 클래스에서 300개의 클래스가 파생 시, 사육사 클래스를 만들고 이 동물을 씻기는 Wash()메소드를 구현한다면 300개의 Wash()메소드를 오버로딩 해야함?
-> 300개의 동물 클래스가 모두 Mammal클래스로 부터 상속 받았기에 이들을 모두 Mammal로 간주해서 딱 하나의 Wash()메소드만 준비하면 됨
class Zookeeper
{
public void Wash(Mammal mammal){}
}
- is : 객체가 해당 형식에 해당하는지 검사하여 그 결과를 bool값으로 반환
Mammal mammal = new Dog();
Dog dog;
if(mammal is Dog)
{
dog = (Dog)mammal;
dog.Bark();
}
- as : 형식 변환 연산자와 같은 역할, 다만 형식 변환 연산자가 실패하는 경우 예외를 던지지만 as연산자는 객체 참조를 null로 만든다.
Mammal mammal2 = new Cat();
Cat cat = mammal2 as Cat;
if(cat!=null)
{
cat.Meow();
}
- (Dog), (Mammal)과 같이 형식변환 대신 as연산자 사용하는 쪽을 권장 ⇒ 실패하더라도 예외가 일어나 갑자기 코드의 실행이 점프하는 일이 없어서 코드 관리가 용이