Vienna
6일차 본문
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();
}
}
}
Comments