본문 바로가기
개발/기타

[C#] 상속과 다형성

by 유다110 2016. 6. 5.
반응형

* 상속

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

댓글