* 상속
class Animal
{
public int Age{get; set;}
public Animal(){this.Age = 0;}
}
class Dog : Animal
{
public string Color{get; set;}
}
0. 자식 클래스는 부모 클래스의 public / protected 멤버에 접근할 수 있다.
1. 자식 클래스의 인스턴스를 만들면, 자신의 멤버와 부모의 멤버 모두에 접근할 수 있다.
** this 가 자신을 나타내는 키워드라면 base 는 부모를 나타내는 키워드이다.
* 다형성
static void Main(string[] args)
{
List<Animal>Animals = new List<Animal>()
{
new Dog(); new Cat(); new Dog();....
}
foreach(var item in Animals)
{
item.Eat();
item.Sleep();
}
}
0. 이때, 자식 클래스에 있는 메서드를 이용하려면, 자식 클래스로 자료형 변환을 해주어야 한다.
1. 근데 Dog() 클래스인데도 억지로 ((Cat)item).Meow(); 이렇게 억지로 형변환을 하면, InvalidCastException이 발생한다.
>> if(item is Dog){} 로 구분해서 해결
2. 클래스 자료형 변환은
0. (클래스명)변수 ex.(Cat)item)
1. 변수 as 클래스 ex.item as Cat
3. 자식 생성자를 호출하면 언제나 부모 생성자가 자동으로 먼저 호출된다.
* 오버라이딩(overriding)
0. 부모 클래스에 있는 메서드를 자식 클래스에서 다시 구현하는 것 "부모의 메서드를 덮어씌운다."
class Parent
{
public virtual void Method()
{
Console.WriteLine("부모 메서드");
}
class Child : Parent
{
public override void Method()
{
Console.WriteLine("자식 메서드");
}
public new void Method2() //new는 클래스를 하이딩으로 변환한다.
{
Console.WriteLine("자식 메서드 두 번째");
}
}
static void Main(string[] args)
{
Child child = new Child();
child.Method(); //"자식 메서드" 출력
((Parent)child).Method(); //"자식 메서드" 출력
child.Method2(); //"부모 메서드" 출력(하이딩 했으므로)
}
}
* 상속과 오버라이딩 제한
0. sealed
0. 클래스에서는 절대 상속하지 말라는 의미를, 메서드에서는 더 이상 오버라이딩 하지 말라는 의미
sealed class Parent
{
public void Test(){}
}
class Child : Parent
{
public void Test(){}
}
/// 오류남!
1. abstract
0. sealed 와 반대로, 무조건 상속해서 쓰라는 의미. 아래와 같이 써야 함
abstract class Parent //abstract를 사용하면 virtual 키워드를 적지 않아도 된다.
{
public abstract void Test();
}
class Child : Parent
{
public override void Test(){}
}
'개발 > 기타' 카테고리의 다른 글
[Github] SSH key 등록 및 커밋 (2) | 2016.11.07 |
---|---|
[C#] 델리게이터(delegate)와 람다(lambda) (5) | 2016.06.09 |
[C#] 인터페이스(interface) (2) | 2016.06.07 |
[C#] 제네릭(Generic)과 구조체(Struct) (2) | 2016.06.05 |
[C#] 클래스 기본 (4) | 2016.06.05 |
댓글