프로그래밍

C# 인터페이스 프로퍼티 질문

왜 C# 인터페이스는 프로퍼티에 protected와 같은 접근 제한자를 쓸 수 없음?

예를 들어,

 

public interface IFlip

{

     public bool CanFlip { get; protected set; }

}

 

public class object : IFlip

{

     public bool CanFlip { get; protected set; }

}

 

이런 게 가능하면 object 클래스 안에서만 CanFlip을 set하고, 외부에서 IFlip을 참조해서 쓸 때는 get만 가능하게 할 수 있을 텐데

왜 이게 안 됨?

17개의 댓글

2024.03.06

왜는 잘 모르겠고.

 

public interface IFlip

{

public bool CanFlip { get; }

}

 

public class object : IFlip

{

public bool CanFlip { get; protected set; }

}

 

이렇게 하면 원하는거 해결되지 않음?

0
2024.03.06
@statover

방금 검색하다가 알긴 했는데 이유가 궁금해짐 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

0
2024.03.06
@statover

인터페이스 내부에서 해당 프로퍼티의 사용이 불가능해진다

0
2024.03.06

? 인터페이스는 멤버 변수를 못 가지고 순수추상메서드만 가져야 한다고 배웠는데 멤버는 가질 수

있음?

 

인터페이스 ㅡ 추상 클래스로 나누던가 하면 될 듯?

그리고 위 코드는 하이딩 된거 아님?

저거 어떤 타입으로 접근했냐에 따라 다른 불 변수 접근하는 거 일 걸요?

c++ 주 언어라 틀린 걸 수 있긴한데... cs 외울 땐 이리 왜움

0
2024.03.06
@RX7900XTX

근데 이거 뭔 용도임? 재정의 왜 하신거...?

0
2024.03.06
@RX7900XTX

인터페이스 내부에 구현된 프로퍼티는 abstract해서 반드시 재정의 해야합니다

0
2024.03.06
@RX7900XTX

멤버 변수는 못 가지는데, 프로퍼티는 가능해요

0
2024.03.06
@덕덕고

그것도 사실상 getter/setter를 가지고 있으니 구체화된 클래스에서 멤버 변수가 있거나 아무튼 getter/setter를 구현했을거라 가정하고 쓰는거라 오토 프로퍼티같은 backing field는 못쓰는 사실상 표기를 편하게한 추상 메서드라 볼 수 있지

0
2024.03.06

이유야 인터페이스가 접근제한이란걸 신경쓰라고 만든게 아니니까 그럴듯.. 애초에 말 그대로 상호간 인터페이스 용도로 만들어졌는데 상대 구현부의 접근제한자를 알 필요가 있을까

그냥 은닉된 상태로 있으면 될 뿐

0
2024.03.06
@postback

근데 재밌는게 C# 8.0부터는 또 인터페이스에서 프로퍼티에 접근 제한자를 설정할 수가 있음. 문제는 이러면 클래스에서 해당 프로퍼티를 명시적으로 구현해야 함....

0
2024.03.06
@덕덕고

이거 나도 이해가 안 되는데 아무래도 추상화 관점에서 보면 안 쓰는게 맞는거같음

0
2024.03.06
@postback

그럼 궁금한 게, 쉽게 비유하자면 내가 동물이라는 Abstract 클래스를 만들고 이를 상속하는 개랑 고양이 등등을 쫘락 만들었어.

근데 내가 점프라는 기능이 필요해서 관련 기능을 인터페이스에 넣고 이 기능이 필요한 동물들에 해당 인터페이스를 상속시켜서

마치 유니티의 컴포넌트처럼 부착이 쉽게 되도록 하고 싶은 거거든?

근데 Interface를 이런 기능으로는 못 쓴다는 거지? 그럼 이런 경우에 좋은 설계 방식이 있을까?

0
2024.03.06
@덕덕고

흠 아무리 봐도 이건 문법 문제가 아니라 디자인 패턴을 공부하셔야 하는 문제인거 같은데요?

인터페이스로 굳이 하고 싶다면 SOLID 중 I(인터페이스 분리 원칙)에 해당되는 걸 하고 싶은 거잖아요?

 

예를 들면 프린터가 있는데 fax, print, scan이라는 기능이 있다고 하는데 라인업(복합기라고 하긴하는데 이건 대충 패스)에 따라 저 3가지 중 1~3개를 써야 한다고 가정합시다.

그라면 abstract class IPrinter에 fax, print, scan함수를 만들고 자식 클래스에서 재정의 해야하는데 위에서 언급했듯이 어떤 프린터는 print, fax까지만 되고 어떤건 print만 되고 어떤건 다 된다고 가정한다면

굳이 재정의 할 필요없는 함수들을 강제적으로 재정의 해야한다는 문제가 발생하겠죠?

 

그렇다면 fax, print, scan을 함수로 만들지말고 따로 따로 인터페이스로 만들어야 됨

interface IFax, interface IPrint, interface IScan이걸로 분리해서

필요한 기능이 있는 인터페이스를 자식 클래스에서 다중 상속하면 됨(c#에서는 interface만 다중 상속 가능)

 

예를 들면 복합기라는 class가 있다면

class 복합기 : IFax, IPrint, IScan

{

void override fax { 재정의 }

void override print { 재정의 }

void override scan { 재정의 }

}

 

만약 fax기능만 필요없다면

class 2가지 기능 복사기 : IPrint, IScan

{

void override print { 재정의 }

void override scan { 재정의 }

}

 

대충 이런식의 디자인 패턴 원칙임

 

0
2024.03.06
@덕덕고

그런데 원하는 걸 대충 보니 최상위 클래스를 통해서 굳이 쩜프를 가져서 자식단에서 정의해야 하는지가 의문임

 

누가봐도 jump 클래스 따로 만들어서 점프 키 입력시 jump.Action()이런식으로 class Jump의 Action 메서드를 호출하면 되는거 아님?

전략, 상태 패턴 이런거 쓰던가 아님 걍 컴포넌트 패턴으로 빼셈

점프 로직이 런타임 중 바뀌어야 한다면 전략 쓰고

아니면 걍 상태 패턴 아님 컴포넌트로 빼면 됨

 

사실 뭐써도 될거 같긴한데... 그냥 점프 로직을 캡슐화해야 하니깐 걍 클래스 따로 파는 거임

그럼 최상위 부모 동물에 예를 들면 Jump 컴포넌트를 멤버로 가지고

자식 단(개 또는 고양이)에서 Jump 컴포넌트를 상속받는 자식 컴포넌트를 동적할당하면 깔끔해짐

 

원하는게 유니티 컴포넌트 넣다 빼듯이 원한다면 걍 ㄹㅇ 컴포넌트 패턴 쓰면됨

이 동물은 jump가 없다면 걍 컴포넌트 안 붙여주면됨(단 null 체크를 하는 로직은 필요하겠죠?)

 

 

0
2024.03.06
@RX7900XTX

어뎁터, 컴포넌트, 전략, 컴포넌트 이거 입맛 맞는걸로 쓰면 될 듯?

4개다 약간씩 용도가 다르긴한데 걍 대충 4개만 공부해도 저런 인터페이스로 하는 것보다는 좋을 듯?

0
2024.03.07
@RX7900XTX

바로 OK입니다 디자인패턴 좀 보러 가겠습니다 감사!!!!!!!!!!!!!!!!

0
2024.03.06
@postback

C++이면 다중상속으로 해결될 것 같은데 C#은 안 되더라고

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180507 [잡담] 유튜브 프리미엄 우회 질문드립니당 개드립눈팅4년 0 1 시간 전 47
180506 [잡담] 블랙샤크v2 pro 2023 vs 소니 mv1 추천좀 게임게임하자 0 1 시간 전 22
180505 [컴퓨터] 인텔 그래픽 드라이버 최신화 인식 왜이따위임? 2 넌뭔데시비냐 0 2 시간 전 74
180504 [모바일] 안드로이드 카메라 어플중에 쓸만한거 뭐있음? 1 일째다이어트하는중 0 2 시간 전 31
180503 [컴퓨터] 집에서 투 컴퓨터 사용시 키보드 마우스 세팅 5 해물잠봉 0 3 시간 전 82
180502 [잡담] 동글 사려는데 싼거사도됨? 6 제로콜라는닥터페... 0 5 시간 전 94
180501 [컴퓨터] 가난개붕이 글카샀다 11 69746974 0 6 시간 전 179
180500 [컴퓨터] 로지텍 무선마우스가 g502x 이거 많이씀?? 9 울그락푸르락 1 6 시간 전 118
180499 [컴퓨터] DDR5는 렘오버한거 차이많이남? 15 창원토박이 0 8 시간 전 202
180498 [컴퓨터] 형들 제품키만 파는것들 써도 되는거야? 4 우루루옳지 0 9 시간 전 102
180497 [잡담] 시네빔 써본 개붕이 있어? 4 따뜻한젤라또 0 9 시간 전 50
180496 [컴퓨터] 다나와에서 컴터 하나 사려고하는데 6 바나나사탕 0 9 시간 전 60
180495 [잡담] 게이밍 노트북 중고 가성비 어때보임? 6 ST11223 0 10 시간 전 144
180494 [컴퓨터] 책상 인증 5 69746974 0 11 시간 전 160
180493 [컴퓨터] 프레임 고정하는 이유가 뭔가요? 5 우루루옳지 0 12 시간 전 166
180492 [모바일] 통신사에 공유기 교체해달라하면 해주나? 5 뱅갈고양이육성중 0 12 시간 전 138
180491 [모바일] 중고폰 선택장애 도와주세요 5 호래빙 0 12 시간 전 70
180490 [컴퓨터] 캐붕이 컴퓨터 어떠냐 9 Benetton 0 14 시간 전 160
180489 [컴퓨터] 형들 컴퓨터 파워가 문제일 가능성이 있을까요? 10 부터시작하는이세... 0 14 시간 전 114
180488 [컴퓨터] 윈도우 ㅅㅂ 왜이러냐 바이러스 관련 업데이트 7 정병장기입원 0 20 시간 전 196