2009-08-25 2 views
4

OracleClient 라이브러리 버전 1.0.5000.0을 사용 중이고 OracleParameter 클래스와 그 구현이 ICloneable 인 것에 대해 혼란 스럽습니다. OracleParameter가 ICloneable을 구현하지만 Clone()을 제공하지 않는 이유는 무엇입니까?

OracleParameter 클래스의 정의입니다 :

public sealed class OracleParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable { 
    public OracleParameter(); 
    public OracleParameter(string name, object value); 
    public OracleParameter(string name, OracleType oracleType); 
    public OracleParameter(string name, OracleType oracleType, int size); 
    public OracleParameter(string name, OracleType oracleType, int size, string srcColumn); 
    public OracleParameter(string name, OracleType oracleType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value); 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    [RefreshProperties(RefreshProperties.All)] 
    [Browsable(false)] 
    public DbType DbType { get; set; } 
    [RefreshProperties(RefreshProperties.All)] 
    public ParameterDirection Direction { get; set; } 
    [Browsable(false)] 
    [DesignOnly(true)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    [DefaultValue(false)] 
    public bool IsNullable { get; set; } 
    [DefaultValue(0)] 
    [Browsable(false)] 
    public int Offset { get; set; } 
    [RefreshProperties(RefreshProperties.All)] 
    public OracleType OracleType { get; set; } 
    [DefaultValue("")] 
    public string ParameterName { get; set; } 
    [DefaultValue(0)] 
    public byte Precision { get; set; } 
    [DefaultValue(0)] 
    public byte Scale { get; set; } 
    [DefaultValue(0)] 
    public int Size { get; set; } 
    [DefaultValue("")] 
    public string SourceColumn { get; set; } 
    public DataRowVersion SourceVersion { get; set; } 
    [DefaultValue("")] 
    [RefreshProperties(RefreshProperties.All)] 
    [TypeConverter(typeof(StringConverter))] 
    public object Value { get; set; } 

    public override string ToString(); 
} 

그것은 System.ICloneable를 구현하지만 Clone() 방법은 거기에 없다.

누구든지 설명 할 수 있습니까?

+0

정말 전체 수업입니까? 코드는 어디서 났니? 반사기? 너 정말 다보고 있니? – BFree

+0

visual studio 2008 F12 - 메타 데이터에서. 흠 ... 반사경은 ICloneable.Clone()을 보여줍니다. 흥미 롭습니다 ... –

답변

5
명시 적으로 다음 구문을 사용하여 인터페이스 멤버를 구현할 수 있습니다 .NET에서

: 당신이 명시 적으로 방법을 사용할 수 있습니다 결과

객체 System.IClonable.Clone() { }

을 예상 인터페이스에 캐스팅.

또한이 수시로 등장 http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleparameter.system.icloneable.clone(VS.85).aspx

+0

그래, 나는 그것을보기 시작했다. 그래서 그것은 메타 데이터에 나타나지 않습니다? 그건 더러운 속임수 야. 당신은이 물건이 있다는 것을 "알아야"합니다. –

+1

때로는 필요한 인터페이스를 구현하는 데 좋은 솔루션 일 수 있지만 인텔리 센스를 오염시키지는 않습니다. 예. C# "using"구문에 대해 Dispose()를 구현하지만 명시 적 호출을위한 또 다른 "더 나은"방법을 제공합니다. "닫기". – Mischa

+1

그래, 그게 답이라고 생각하지만, 나는 그처럼 무시 무시한 API 디자인을 본 적이 있는지 모르겠다. 파생 된 매개 변수를 캐싱하고 재사용하려고 시도하면 복제하지 않으면 오류가 발생하지만 클래스를 분해하거나 "알기"만하지 않으면 복제 방법이 숨겨집니다. 오라클은 결코 API 디자인의 빛나는 사례가 아니었지만 이것은 완전히 악의적 인 것입니다. –

2

를 참조하십시오. :) 다음을 확인하십시오 ...

void Main() 
{ 
    var e = new Example(); 
    I i = e as I; 

    e.m1(); // prints Class m1() 
    i.m1(); // prints Interface m1() 
} 

public interface I 
{ 
    void m1(); 
} 

public class Example : I 
{ 
    public void m1() 
    { 
    Console.WriteLine("Class m1()"); 
    } 

    void I.m1() 
    { 
    Console.WriteLine("Interface m1()"); 
    } 
} 
+0

그래, 지금은 얻을 수 있지만 왜 세계에서 메타 데이터에 나타나지 않을까요? 그것은 단지 의미입니다. –

+0

그것은 엘리슨 음모가 될 수 있습니다. :) 나는 실제로 그런 종류의 충격을 받았다. 그러나, 나는 Reflector (http://www.red-gate.com/products/reflector/)가 그것을 볼 것이라고 확신한다. –

+0

예, 리플 렉터 (Reflector)가 그걸 가져 왔지만, 그건 미친 API입니다. 이 클래스를 유용하게 사용하려면 코드를 복제해야하는 것처럼 보이지만 코드를 분해하지 않으려는 사람은이 조작을 숨길 수 있습니다. –

관련 문제