Vienna

6일차 본문

언어/이것이 C#이다

6일차

아는개발자 2021. 12. 3. 21:43

1. 실습_Interface

using System;
using System.IO;
using Interface;

namespace Interface
{
    interface ILogger
    {
        void WriteLog(string message);
    }

    class ConsoleLogger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine(
                "{0} {1}",
                DateTime.Now.ToLocalTime(), message);
        }
    }

    class FileLogger : ILogger
    {
        private StreamWriter writer;

        public FileLogger(string path)
        {
            writer = File.CreateText(path);
            writer.AutoFlush = true;
        }

        public void WriteLog(string message)
        {
            writer.WriteLine("{0} {1}", DateTime.Now.ToShortTimeString(), message);
        }
    }

    class ClimateMoniter
    {
        private ILogger logger;
        public ClimateMoniter(ILogger logger)
        {
            this.logger = logger;
        }

        public void start()
        {
            while(true)
            {
                Console.Write("온도를 입력해주세요: ");
                string temperature = Console.ReadLine();
                if (temperature == "")
                    break;
                logger.WriteLog("현재 온도: " + temperature);
            }
        }
    }
}

namespace _8장_Interface_303page
{
    class Program
    {
        static void Main(string[] args)
        {
            ClimateMoniter monitor = new ClimateMoniter(new FileLogger("MyLog.txt"));

            monitor.start();
        }
    }
}

 

2. 비타민 퀴즈 8-1

앞의 예제 프로그램에서 ClimateMonitor의 logger가 FileLogger 대신 ConsoleLogger의 객체를 가리키도록 바꿔서 테스트해 보세요.
namespace _8장_Interface_303page
{
    class Program
    {
        static void Main(string[] args)
        {
            ClimateMoniter monitor = new ClimateMoniter(new ConsoleLogger());

            monitor.start();
        }
    }
}

나머지는 동일하므로 생략했다.

 

3. 실습_DerviedInterface

using System;

namespace _8장_DerivedInterface_307page
{
    interface ILogger
    {
        void WriteLog(string messgae);
    }

    interface IFormattableLogger : ILogger
    {
        void WriteLog(string format, params Object[] args);
    }

    class ConsoleLogger2 : IFormattableLogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), message);
        }

        public void WriteLog(string format, params Object[] args)
        {
            string message = String.Format(format, args);
            Console.WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IFormattableLogger logger = new ConsoleLogger2();
            logger.WriteLog("The world is not flat.");
            logger.WriteLog("{0} + {1} = {2}", 1, 1, 2);
        }
    }
}

 

4. 실습_MultiInterfaceInheritance

using System;

namespace _8장_MultiInterfaceInheritance_310page
{
    interface IRunnable
    {
        void Run();
    }

    interface IFlyable
    {
        void Fly();
    }

    class FlyingCar : IRunnable,IFlyable
    {
        public void Run()
        {
            Console.WriteLine("Run! Run!");
        }

        public void Fly()
        {
            Console.WriteLine("Fly! Fly!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            FlyingCar car = new FlyingCar();
            car.Run();
            car.Fly();

            IRunnable runnable = car as IRunnable;
            runnable.Run();

            IFlyable flyable = car as IFlyable;
            flyable.Fly();
        }
    }
}

 

5. 비타민 퀴즈 8-2

여기에 인터페이스 둘(IFlyable, Irunnable)과 이 두 인터페이스를 각각 상속하는 두 개의 클래스 (Plane, Car), 그리고 두 인터페이스를 동시에 상속하는 하나의 클래스 (FlyingCar)가 있습니다. 이들을 이용해서 인터페이스 다중상속과 포함 기법을 활용해 클래스 다중 상속을 흉내내 보세요.
using System;

namespace Vitamin8_2_312page
{
    interface IRunnable
    {
        void Run();
    }

    interface IFlyable
    {
        void Fly();
    }

    class Car : IRunnable
    {
        public void Run()
        {
            Console.WriteLine("Run!");
        }
    }

    class Plane : IFlyable
    {
        public void Fly()
        {
            Console.WriteLine("Fly!");
        }
    }

    class FlyingCar : IRunnable, IFlyable
    {
        Car car = new Car();
        Plane plane = new Plane();

        public void Run()
        {
            car.Run();
        }

        public void Fly()
        {
            plane.Fly();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            FlyingCar car = new FlyingCar();
            car.Run();
            car.Fly();

            IRunnable runnable = car as IRunnable;
            runnable.Run();

            IFlyable flyable = car as IFlyable;
            flyable.Fly();
        }
    }
}

 

6. 실습_DefaultImplementation_컴파일에러

using System;

namespace _8장_DefaultImplementation_314page
{
    interface ILogger
    {
        void WriteLog(string message);

        void WriteError(string error)
        {
            WriteLog($"Error: {error}");
        }
    }

    class ConsoleLogger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine($"{DateTime.Now.ToLocalTime()}, {message}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ILogger logger = new ConsoleLogger();
            logger.WriteLog("System Up");
            logger.WriteError("System Fail");

            ConsoleLogger clogger = new ConsoleLogger();
            clogger.WriteLog("System Up");
            clogger.WriteError("System Fail");
        }
    }
}

 

7. 실습_AbstactCalss

using System;

namespace _8장_AbstactCalss_317page
{
    abstract class AbstractBase
    {
        protected void PrivateMethodA()
        {
            Console.WriteLine("AbstactBase.PrivateMethodA()");
        }

        public void PublicMethodA()
        {
            Console.WriteLine("AbstactBase.PublicMethodA()");
        }

        public abstract void AbstractMethodA();
    }

    class Derived : AbstractBase
    {
        public override void AbstractMethodA()
        {
            Console.WriteLine("Derived.AbstractMethodA()");
            PrivateMethodA();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            AbstractBase obj = new Derived();
            obj.AbstractMethodA();
            obj.PublicMethodA();
        }
    }
}

 

 

'언어 > 이것이 C#이다' 카테고리의 다른 글

8일차  (0) 2021.12.05
7일차  (0) 2021.12.04
5일차  (0) 2021.11.30
4일차  (0) 2021.11.25
3일차  (0) 2021.11.24
Comments