이 WebResourceBase
실제로 ResourceBase
을 상속하는 것을 의미한다고 가정합니다.
암시 적 연산자를 더 멋지게 만들 수는 없지만 불행히도 여기서는 제네릭이 작동하지 않습니다.
대안 : 제네릭 종류의 (하나의 옵션은 파생 클래스를 참조하는 일반적인 매개 변수를 포함하는 클래스를 수정하는 것입니다 내가 한 것을를 다시 읽고 당신이 계신 이해 이제 ResourceBase
을 제한하는) 자체 참조처럼 :
public abstract class ResourceBase
{ }
public abstract class WebResourceBase<T> : ResourceBase
where T : WebResourceBase<T>
{
public T LocalPath { get; set; }
public T FtpPath { get; set; }
}
public class JavaScript : WebResourceBase<JavaScript>
{
}
그럼 당신은 JavaScript
에서 속성 LocalPath
및 FtpPath
는 이제 유형 JavaScript
의 것을 볼 수 있습니다.
new JavaScript()
{
LocalPath = new JavaScript("/path/goes/here/1.js"),
FtpPath = new JavaScript("ftp://path/goes/here/1.js")
}
는 기본 속성은 현재 유형이어야 이상의 파생, 이하 유도하기 위해 제한됩니다되는이 방법의 장점 :
이제 과제는 만JavaScript
유형을 받아 들일 것입니다.
대안 : 명시 구문 분석하는 대신 여기에 제네릭을 사용할 수 없습니다 ResourceBase
로 LocalPath
및 FtpPath
변수를 떠나, 또는 달리해야하는 경우
, 당신의 암시 운영자가 혼란 스러울 시작합니다 implicit
연산자.
new JavaScript()
{
LocalPath = JavaScript.Parse("/path/goes/here/1.js"),
FtpPath = JavaScript.Parse("ftp://path/goes/here/1.js")
}
class JavaScript
{
public static ResourceBase Parse(string s)
{
if (path.EndsWith(".js"))
return new JavaScript(path);
throw new Exception();
}
}
대체 : 더 나은는 정적 메서드와 같은 명시적인 것을 제공하는 클래스 계층 구조 대신 implicit
운영자
구워 생성자를 통해 유형에 문자열을 소비 개념의 분석과 특성을 공개 읽기 전용 :
public abstract class ResourceBase
{ }
public abstract class WebResourceBase
{
public ResourceBase LocalPath { get; private set; }
public ResourceBase FtpPath { get; private set; }
protected abstract ResourceBase ParseLocalPath(string s);
protected abstract ResourceBase ParseFtpPath(string s);
}
public class JavaScript : WebResourceBase<JavaScript>
{
protected override ResourceBase ParseLocalPath(string s)
{
// etc.
}
protected override ResourceBase ParseFtpPath(string s)
{
// etc.
}
}
것은 여보 되려면 est, 이것의 대부분은 문자열에서 특정 유형으로 설정된 두 개의 속성을 얻으려는 약간의 잔인 함으로 보입니다. 많은 옵션이 있습니다. 암시 적 연산자도 작동합니다.
가장 이해하기 쉬운 것을 선택하십시오. 연산자 오버로드는 파기하지 않는 한 다소 숨겨진 경향이 있습니다.
'WebResourceBase'는'ResourceBase'에서 파생되어야합니까? – eyossi
암시 적 연산자를 사용하지 않고이를 매핑하는 명시 적 함수를 구현했습니다. 이것은 프로젝트의 수명 동안 코드를 유지하고 이해하는 것을 더욱 어렵게 만들 것입니다. –
@Vince 죄송합니다. 지금 문제가 있습니다. 나는 내 대답을 고칠 것이다. –