다음과 같이 추상 Catalog 클래스가 있습니다. 제공된 위치 유형을 기반으로 특정 콘크리트 카탈로그를 반환하는 데 사용되는 정적 메서드 OpenCatalog()가 있습니다. 카탈로그의 유형을 결정하면 올바른 콘크리트 카탈로그 유형의 특정 OpenCatalog() 메소드를 호출합니다. 예를 들어 SQL 데이터베이스에 저장된 카탈로그 나 파일 시스템에 저장된 카탈로그를 구현할 수 있습니다. 아래 코드를 참조하십시오.정적 방법을 숨기시겠습니까?
public abstract class Catalog
{
public static ICatalog OpenCatalog(string location, bool openReadOnly)
{
if(location is filePath)
{
return FileSystemCatalog.OpenCatalog(string location, bool openReadOnly);
}
else if(location is SQL server)
{
return SqlCatalog.OpenCatalog(string location, bool openReadOnly);
}
else
{
throw new ArgumentException("Unknown catalog type","location");
}
}
...
}
public abstract class FileSystemCatalog:Catalog
{
public static new ICatalog OpenCatalog(string location, bool openReadOnly)
{
//Deserializes and returns a catalog from the file system at the specified location
}
...
}
public abstract class SqlCatalog:Catalog
{
public static new ICatalog OpenCatalog(string location, bool openReadOnly)
{
//creates an returns an instances of a SqlCatalog linked to a database
//at the provided location
}
...
}
처음으로 일반적으로 정적 방법을 숨기시겠습니까? 나는 그것이 가능하다는 것을 알고 있지만, 너무 자주해서는 안되는 것처럼 보입니다. 또한 정적 메서드를 숨기는 것이 좋은 경우 나 유효한 작업을 수행 할 수있는 유효한 예제입니까?
알았어. 항상 각 구체적인 카탈로그 유형의 생성자를 직접 호출하지는 않겠지 만. 예를 들어 내 FileSystemCatalog가 열리면 XML 파일에서 DataContractSerializer를 통해 deserialize됩니다. 실제로 생성자를 호출하는 것은 DataContractSerializer입니다. 따라서 정적 메서드가 필요합니다. 여기서 aDataContractSerializer를 인스턴스화하고 파일에서 카탈로그를 deserialize하려고 시도 할 수 있습니다. –
네, 괜찮아요, 그냥 삽화를 위해'새로운 FileSystemCatalog'를 넣었습니다. 또한이 메소드가'Catalog' 이외의 클래스에있는 것이 아니라 메소드가 정적 일 필요가 없으므로 단위 테스트에서 조롱 될 수 있습니다. –