인터페이스의 선언


interface 인터페이스_이름

{

//인터페이스는 메소드 , 이벤트 , 인덱서 , 프로퍼티만을 가질 수 있다.

}


인터페이스는 인스턴스를 만들 수 없지만, 참조는 가능하다. 접근제한한정자를 사용할 수 없고, 모든것이 public 으로 선언된다.

인터페이스를 상속받는 클래스는 반드시 인터페이스에 있는 모든 메소드(및 프로퍼티 , 이벤트, 인덱서)를 구현해야하며 , 이 메소드들은 public 한정자로 수식해야한다.


interface ILogger

{

void WrtieLog(string log);

}


class ConsoleLogger : ILogger

{

public void WriteLog(string message)

{   

Console.WriteLine( "{0} {1}" , DateTime.now.ToLocalTime , message);

}

}


ILogger logger = new ConsoleLogger(); // Consolelogger클래스 형식의 객체를 ILogger 인터페이스 형식의 객체와 같은형식으로 취급가능

logger.WriteLog("Hello , World");


인터페이스를 상속받은 클래스로 객체를 정의할 때 , 클래스의 객체는 인터페이스의 객체와 같은 형식으로 취급할 수 있다.   


인터페이스는 클래스를 만들때 프로그래머에게 다양한 형태를 제공할 수 있다. ex) 로그의 저장형식을 자유롭게 설정할수있다


class ClimateMonitor

{

private ILogger logger;

public ClimateMonitor( ILogger logger) // 클래스의 생성자선언

{

this.logger = logger; // 생성자의 매개변수에 투입되는 ILogger 참조형식의 객체와 같은인스턴스로 logger 를 초기화

}

public void start()

{

while(true)

{

console.Write("온도를 입력해주세요");

string temperature = Console.ReadLine();

if ( temperature == "")

break;


logger.WriteLog(" 현재온도 : " + temperature );

}

}

}


ClimateMonitor monitor = new ClimateMonitor( new ConsoleLogger());

monitor.start();


class FileLogger : ILogger

{

private StreamWriter writer;


public FileLogger(string path) // 생성자

{

writer = File.CreateText(path);

writer.AutoFlash = true;

}


public void WriteLog(string message)

{

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

}

}


ClimateMonitor monitor = new ClimateMonitor(new FileLogger("MyLog.txt"));

monitor.start();


인터페이스를 상속하는 인터페이스

// 상속하려는 인터페이스가 소스코드가 아닌 어셈블리로만 제공되는경우, 이미 소스코드를 진행한 상태라 인터페이스를

수정하면 코드에 문제가 생기는 경우, 인터페이스를 상속하는 인터페이스를 만든다.


interface 파생인터페이스 : 부모인터페이스

{

// 추가할 메소드

}


* 여러개의 클래스를 상속할수는 없지만 여러개의 인터페이스를 상속하는것은 가능하다 (죽음의 다이아몬드)

- 다중인터페이스의 상속을 통해 다형성을 만족시킬 수 있다.


추상클래스

추상클래스는 구현을 가질 수 있지만, 인스턴스는 만들 수 없다.


abstract class 클래스 이름

{

// 

}

추상클래스 또한 한정자를 설정하지 않으면 private로 자동 설정된다. 

추상클래스는 추상메소드를 가질 수 있다. 추상메소드는 구현을 갖지못하지만, 파생클래스에서 반드시 구현하도록 강제함.

추상메소드는 반드시 한정자중 하나로 수식되어야한다.(abstract로 수식되지 않았다면, 구현하지 않아도 된다.)

추상클래스를 또다른 추상클래스가 상속할 경우, 이때는 추상 메소드를 구현할 필요없고, 인스턴스를 생성할 클래스에서 구현하면된다.


abstract class  AbstractBase

{

public abstract void SomeMethod();

}


class Derived : AbstractBase

{

public override void SomeMethod()

{

//

}

}





+ Recent posts