c# - 차이 - 개체 인스턴스 를 만들 려면 new 키워드 를 사용 하십시오




상속 된 멤버 숨기기 (6)

상속 된 멤버를 효과적으로 숨기는 방법을 찾고 있습니다. 공통 기본 클래스를 상속받은 클래스 라이브러리가 있습니다. 보다 최신의 자손 클래스 중 일부는 흔적이되어 버린 종속성 속성을 상속하며 IntelliSense를 사용하거나 비주얼 디자이너에서 클래스를 사용할 때 약간 혼란 스러울 수 있습니다.

이 클래스는 WPF 또는 Silverlight 2.0 용으로 컴파일되도록 작성된 모든 컨트롤입니다. ICustomTypeDescriptorICustomPropertyProvider 에 대해 알고 있지만 Silverlight에서는 사용할 수 없다는 점을 확신합니다.

사용성 문제만큼 기능적인 문제는 아닙니다. 어떻게해야합니까?

최신 정보

내가 숨기고 싶은 속성 중 일부는 내 자신이 아닌 조상에서 왔고 내가 설계하고있는 특정 도구 때문에 new 연산자로 멤버를 숨길 수는 없습니다. (나는 우스꽝 스럽다)


나는 이것에 대한 몇 가지 해답이 있다는 것을 알고 있으며, 지금은 꽤 오래된 것이지만, 이것을하기위한 가장 간단한 방법은 그것들을 new private 으로 선언하는 것입니다.

타사 DLL의 모든 메소드를 사용할 수있게하는 API가있는 현재 작업중인 예제를 생각해보십시오. 나는 그들의 메소드를 가져야하지만 "getThisValue"및 "setThisValue"메소드 대신 .Net 속성을 사용하려고합니다. 따라서 두 번째 클래스를 만들고 첫 번째 클래스를 상속 받아 get 및 set 메서드를 사용하는 속성을 만든 다음 원래 get 및 set 메서드를 재정의합니다. 그것들은 다른 것을 만들려는 사람들에게 여전히 사용 가능하지만, 내가 만들고있는 엔진을 사용하고자한다면, 메소드 대신에 프로퍼티를 사용할 수 있습니다.

이중 클래스 메서드를 사용하면 멤버를 숨기기 위해 new 선언을 사용할 수 없다는 제한이 없어집니다. 멤버가 가상으로 표시되면 override 사용할 수 없습니다.

public class APIClass
{
    private static const string DllName = "external.dll";

    [DllImport(DllName)]
    public extern unsafe uint external_setSomething(int x, uint y);

    [DllImport(DllName)]
    public extern unsafe uint external_getSomething(int x, uint* y);

    public enum valueEnum
    {
        On = 0x01000000;
        Off = 0x00000000;
        OnWithOptions = 0x01010000;
        OffWithOptions = 0x00010000;
    }
}

public class APIUsageClass : APIClass
{
    public int Identifier;
    private APIClass m_internalInstance = new APIClass();

    public valueEnum Something
    {
        get
        {
            unsafe
            {
                valueEnum y;
                fixed (valueEnum* yPtr = &y)
                {
                    m_internalInstance.external_getSomething(Identifier, yPtr);
                }
                return y;
            }
        }
        set
        {
            m_internalInstance.external_setSomething(Identifier, value);
        }
    }

    new private uint external_setSomething(int x, float y) { return 0; }
    new private unsafe uint external_getSomething(int x, float* y) { return 0; }
}

이제 valueEnum은 두 클래스 모두에서 사용할 수 있지만 속성 만 APIUsageClass 클래스에 표시됩니다. APIClass 클래스는 원래 API를 확장하거나 다른 방식으로 사용하려는 사용자가 계속 사용할 수 있으며 APIUsageClass는 더 간단한 것을 원하는 사용자가 사용할 수 있습니다.

궁극적으로, 내가하고있는 일은 APIClass를 내부적으로 만들고 내 상속받은 클래스 만 노출하는 것입니다.


나는 제안 된 모든 솔루션을 테스트했으며 실제로 새로운 회원을 숨기지 않습니다.

하지만이 방법은 :

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new string MyHiddenProperty
{ 
    get { return _myHiddenProperty; }
}

하지만 코드에서 보면 여전히 액세스 할 수 있으므로 더 추가합니다. 더 이상 사용되지 않는 특성

[Obsolete("This property is not supported in this class", true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new string MyHiddenProperty
{ 
    get { return _myHiddenProperty; }
}

상속 된 멤버가 내 지식을 사용하는 것을 막을 수는 없지만 EditorBrowsableAttribute 사용하여 IntelliSense에서 멤버를 숨길 수 있습니다.

Using System.ComponentModel;

[EditorBrowsable(EditorBrowsableState.Never)]
private string MyHiddenString = "Muahahahahahahahaha";

편집 : 그냥이 목적을 위해 쓸모없는 만드는 설명서 주석을 보았다 :

이 특성이 "동일한 어셈블리의 클래스에있는 멤버를 숨기지 않습니다"라는 두드러진 메모가 있습니다. 그것은 사실이지만 완료되지는 않았습니다. 사실,이 속성은 동일한 솔루션에있는 클래스의 멤버를 숨기지 않습니다.


완전히 숨기고 사용하지 않기로 표시하려면, 대부분의 독자가 기대하는 것 인 인텔리 센스를 포함하여 ...

[Obsolete("Not applicable in this class.")] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]

제 생각에 당신이 가장 잘하는 방법은 상속에 반대되는 작곡을 고려하는 것입니다.

또는 원하는 멤버가있는 인터페이스를 만들고 파생 클래스에서 해당 인터페이스를 구현하고 인터페이스에 대해 프로그래밍 할 수 있습니다.


above Michael Suggests처럼 재정의하고 사람들이 재정의 된 (sp?) 메서드를 사용하지 못하도록 막히면 더 이상 사용되지 않는 것으로 표시합니다.

[Obsolete("These are not supported in this class.", true)]
public override  void dontcallmeanymore()
{
}

두 번째 parm이 true로 설정되면 누군가가 해당 메소드를 호출하려고 시도하고 첫 번째 parm의 문자열이 메시지 일 경우 컴파일러 오류가 생성됩니다. parm2가 false 인 경우 컴파일러 경고 만 생성됩니다.





dependency-properties