[ C# ] 상속2

2023. 1. 13. 17:12C#

728x90

■ Override 

  • 상위 메서드를 무시하고 하위에서 재정의 하는 것
  • 대상 : 클래스 메서드 > 속성 ,인덱서, 이벤트
  • 상위 클래스에는 virtual 명시
  • 하위 클래스에는 override 명시
using System;

namespace overrideA
{
    class A
    {
        public virtual void Print()
        {
            Console.WriteLine("A Print");
        }

    }
    class B : A
    {
        public override void Print()
        {
            Console.WriteLine("B Print");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            B Test = new B();
            Test.Print();

            A Test1 = Test;
            Test1.Print();

        }
    }
}

■Overload

  • 역할 : 하나의 메서드명에 다양한 매개변수 적용
  • 장점 : 하나의 메서드로 다양한 값을 대입
  • 형식 : 메서드명만 동일 , 매개변수는 임의로 적용
  • 호출 : 메서드명과 매개변수로 호출
using System;

namespace overrideA
{
    class A
    {
        public void Print() { Console.WriteLine("HI"); }
        public void Print(int num)
        {
            Console.WriteLine(num);
        }
        public float Print(int num , float pi)
        {
            Console.WriteLine("{0} {1}", num, pi);
            return pi;
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            A Test = new A();
            Test.Print();
            Test.Print(100);
            float pi = Test.Print(3, 3.14f);
            Console.WriteLine(pi);
        }
    }
}

 

■추상 클래스 

  • abstract  : 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용
  • 구현하려는 메서드의 형태만 존재하는 클래스
  • 추상 클래스는 구현 형태만 제공 실제 구현은 하위에서 구현
  • 제한 사항 
    • 추상 클래스는 상속으로만 사용
    • new를 통해 생성할 수 없다.
    • abstract가 있는 상위 메서드만 하위에서 모두 구현
  • 용도 : 주어진 형태로 메서드를 구성해야 하는 경우
using System;

namespace overrideA
{
    abstract class A
    {
        int number = 3;
        public abstract void Print();
        public void PrintNumber()
        {
            Console.WriteLine(number);
        }
    }

    class B : A
    {
        public override void Print()
        {
            Console.WriteLine("abstract class");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            B Test = new B();
            Test.Print();
            Test.PrintNumber();

            //A Test1 = new A();
            //Test1.Print();
            //Test1.PrintNumber();
            
            //A class는 추상형식이므로 생성될 수 없다.
        }
    }
}

■ 다형성 ( polymorphism )

  • 상속 관계에서 일어남
  • 같은 종의 생물이면서도 어떤 형태나 형질이 다양하게 나타나는 현상
  • 일반적 형태 : 상위에서 하위 호출
class A 
{
	public virtual void Print() { .... } 
}

class B : A 
{
	public override void Print() { .... }
    ....
}
A Test = new B();
Test.Print();
using System;

namespace mopholo
{
    class A
    {
        public virtual void Print() { Console.WriteLine("Hi Hwang Ui jung "); }

    }
    class B : A
    {
        public override void Print() { Console.WriteLine("Hi Vision inteligense"); }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A Test1 = new B();
            Test1.Print();

            // =----- cast 형을 이용한 참조
            B Test2 = new B();
            A Test3 = new A();
            Test3.Print();
            Test2.Print();
        }
    }
}

■ 박싱과 언박싱 ( boxing & unboxing )

 

  • 박싱 
    • 값 형식을 object 형 변환 (int , double , float )
  • 언박싱 
    • object 형을 다시 값 형식으로 변환
    • cast를 사용하여 형을 명시
  • 클래스는 상속 관계에 있으므로 참조 변환이 된다. (Uncasting , Downcasting ) 
using System;

namespace mopholo
{
    struct DATA
    {
        public string name;
        public int number;

        public DATA(string name, int number)
        {
            this.name = name;
            this.number = number;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int num = 3;
            object obj = num;
            int result = (int)obj;

            Console.WriteLine("{0} {1} ", num, result);
            //========================================

            DATA Test = new DATA("Test", 3);
            object obj1 = Test;
            DATA Test1 = (DATA)obj1;
            Console.WriteLine("{0} {1} ", Test1.name, Test1.number);
        }
    }
}

out : 3 
out : Test 3
using System;

namespace mopholo
{
    class A
    {
        public void PrintA() { Console.WriteLine("Hello"); }
    }
    class B : A
    {
        public void PrintB() { Console.WriteLine("Hwang Ui jung"); }

    }
    class Program
    {
        static void Main(string[] args)
        {
            B Test1 = new B();
            object obj = Test1;
            A Test2 = (A)obj;
            Test1.PrintB();
            Test2.PrintA();

        }
    }
}

 

728x90

'C#' 카테고리의 다른 글

[ C# ] Window Programing  (0) 2023.01.16
[ C# ] 인터페이스 ( interface )  (0) 2023.01.16
[ C# ] 상속  (0) 2023.01.13
[ C# ] 델리게이트 , 이벤트  (0) 2023.01.12
[ C# ] 인덱서 Indexer  (0) 2023.01.12