, AbsClass, ICLASS와 추상 클래스에서 파생되는 클래스의 속성에 설정 접근을 추가. IClass에는 접근 자 가져 오기와 함께 몇 가지 속성이 있습니다. AbsClass은 IClass의 속성을 AbsClass에서 파생되는 클래스로 정의되는 추상 속성으로 구현합니다.만 get 접근
그래서 에서 AbsClass를 도출의 모든 클래스는 가져 오기 접근과 같은 특성을 갖는 의해 ICLASS을 만족해야합니다. 그러나 경우에 따라 IClass에서 속성에 설정된 접근자를 추가 할 수 있기를 원합니다. 그러나 나는이 오류
AbsClass.Bottom가 재정의 set 접근이 없기 때문에 ConcClassA.Bottom.Set는 무시할 수 없습니다
참조를 얻을 set 접근과 에 AbsClass을 추상적 인 속성을 재정의하려고하면 ConcClassA.
IClass 인터페이스 만 구현하고 AbsClass를 상속하지 않는 클래스가있는 경우 문제가있는 세트 접근자를 추가 할 수 있습니다. 아래 ConcClassB을 참조하십시오.
나는 AbsClass 대신 직접 AbsClass를 파생시킬 때마다 IClass를 구현할 수 있습니다. 그러나 나는 내 AbsClass가 IClass 일 필요가 있음을 알고 있으므로 계층 구조에서 상위 클래스를 지정하려고합니다.
public interface IClass
{
double Top
{
get;
}
double Bottom
{
get;
}
}
abstract class AbsClass:IClass
{
public abstract double Top
{
get;
}
public abstract double Bottom
{
get;
}
}
class ConcClassA : AbsClass
{
public override double Top
{
get { return 1; }
}
public override double Bottom
{
get { return 1; }
//adding a Set accessor causes error:
//ConcClassA.Bottom.Set cannot override because AbsClass.Bottom does not have an overridable set accessor
//set { }
}
}
class ConcClassB : IClass
{
public double Top
{
get { return 1; }
//added a set accessor to an interface does not cause problem
set { }
}
public double Bottom
{
get { return 1; }
}
}
업데이트 그래서 내가 추상적 예를 사용하여 다음 대신 할 노력하고있어 정확하게 설명 할 경우이 더 이해가 것이라 생각합니다. 저는 건축 회사에서 일하면서 건축 설계 프로젝트와 관련된 비즈니스 오브젝트입니다.
나는 프로젝트의 한 유형을 나타내는 추상 클래스 RhNodeBuilding을 가지고 있습니다. 바닥을 가질 수있는 기능과 같은 몇 가지 일반적인 기능이 있으며 RhNodeBuilding에 정의되어 있습니다. RhNodeBuilding은 또한 더 큰 프로젝트 트리 구조의 일부가 될 수있는 또 다른 추상 클래스를 상속합니다.
RhNodeBuilding 모든 건물을 제공 할 수 있어야 읽기 전용 속성의 수를 정의하는 인터페이스 IBuilding에서 구현 등 TopElevation, BottomElevation, 높이, NumberOfFloors 등 등 .기타..RhNodeBuilding에서 파생되지는 않지만 여전히 IBuilding을 구현해야하는 다른 건물 유형이 있습니다. MassBuilding 및 FootPrintBuilding :
는 지금은 RhNodeBuilding에서 파생 된 두 가지 유형이있다. MassBuilding은 사용자가 만든 3D 모양으로 정의됩니다. 해당 모양은 TopElevation 및 BottomElevation으로 해당 속성을 통해 액세스 할 수 있어야하지만 속성을 변경하여 3D 볼륨을 편집하면 안됩니다.
FootPrintBuilding은 닫힌 커브와 해당 커브를 돌출시키는 높이 범위로 정의됩니다. 따라서 클래스가 현재 고도가 무엇인지를 반환 할 수있을뿐만 아니라 이러한 고도 또한 높이 범위를 다시 정의 할 수 있어야합니다.
요약하면. 모든 건물 (IBuildings)는 TopElevation 및 BottomElevation를 반환 할 수 있어야하지만, 모든 건물은 TopElevation 또는 BottomElevation가 직접 설정할 수 있도록한다. 모든 RhNodeBuildings은 수 직접 BottomElevationTopElevation 및 을 설정할 수 IBuildings하고, 또는 필요하지 않을 수도 있습니다 RhNodeBuilding에서 파생 클래스입니다.
public interface IBuilding
{
double Top
{
get;
}
double Bottom
{
get;
}
}
abstract class RhNodeBuilding:IBuilding
{
public abstract double Top
{
get;
}
public abstract double Bottom
{
get;
}
}
class MassBuilding: AbsClass
{
//mass building only returns Top and Bottom properties so it works fine
public override double Bottom
{
get { return 1; }
}
public override double Top
{
get { return 1; }
}
}
class FootPrintBuilding: AbsClass
{
//Top and Bottom of FootPrintBuilding can both be retrieved and set
public override double Top
{
get { return 1; }
//adding a Set accessor causes error:
//cannot override because RhNodeBuilding.Top does not have an overridable set accessor
//set { }
}
public override double Bottom
{
get { return 1; }
//adding a Set accessor causes error:
//cannot override because RhNodeBuilding.Bottom does not have an overridable set accessor
//set { }
}
}
는 최선의 선택이 RhNodeBuilding이 IBuilding을 구현하지하는 것입니다처럼 지금 보인다 아니라 IBuilding을 구현 RhNodeBuilding에서 파생 된 모든 클래스가 있습니다. 그런 식으로 속성을 정의 할 수 있습니다 IBuilding보다는 직접 오버라이드.
abstract class AltRhNodeBuilding
{
public abstract double Top
{
get;
}
}
class AltFootPrintBuilding: IClass
{
public override double Top
{
get { return 1; }
//Can't add set access to overridden abstract property
set { }
}
//No problem adding set accessor to interface property
public double Bottom
{
get { return 1; }
set { }
}
}
"이 속성은 때때로 읽기 전용이지만 때로는 그렇지 않다"는 말로 인터페이스 "계약"을 위반하지 않습니까? 아마도 읽기 전용이 필요한 클래스와 읽기/쓰기가 필요한 클래스를 허용하기 위해 인터페이스를 분리해야합니다 (예 : 다른 인터페이스로). –
속성 접근자가 없다는 것은 해당 속성이 모든 사람에게 읽기 전용임을 의미하지는 않습니다 (즉, 변경 불가능하고 값이 변경되지 않음). 이는 해당 속성을 사용하는 클라이언트의 속성이 읽기 전용임을 의미합니다. 그래서, 아니, 그것은 계약 변경을 깨뜨리는 것이 아닙니다. 그것은 단지 C#/CLR 제한입니다. –
동의, 인터페이스 계약은 구현하지 않아도되는 것이 아니라 구현해야하는 것을 지정합니다. –