문제

내가 찾는 몇 가지 방법을 효과적으로 숨기기 상속 회원입니다.나는 라이브러리의 클래스를 상속에서 일반적인 기본 클래스입니다.최근 일부 하위 클래스를 상속 종속성있는 흔적과될 수 있는 조금 복잡할 때 사용하는 IntelliSense 거나 사용하여 수업에서는 비주얼 디자이너.

이러한 클래스를 모든 컨트롤에 기록되는 컴파일 중 하나에 대한 WPF 또는 Silverlight2.0.나는에 대해 알 ICustomTypeDescriptorICustomPropertyProvider, 지만,나는 특정 사람들 에서 사용할 수 없습니다 Silverlight.

그것은 많은 기능적인 문제로 유용성 문제입니다.나는 무엇을 해야 합니까?

업데이트

의 일부는 속성을 숨길에서 올 조상하지 않는 나 자신 때문에 특정 도구 나는 디자인을 위해,나는 할 수 없으로 멤버 숨기기 new 연산자입니다.(나는 알고,그것은 말도)

도움이 되었습니까?

해결책

재지정을 다음과 같이클 제안 을 방지하고 사람에서 사용하는 재정의(sp?) 방법,표시되지 않는다:

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

두 번째 경우 parm true 로 설정하면,컴파일러 오류가 발생한 경우려는 사람들에게 전화하는 방법과 문자열에서 첫 번째 parm 는 메시지입니다.는 경우 parm2 은 거짓만 컴파일러 경고가 생성됩니다.

다른 팁

하는 동안 당신을 막을 수 없습니다 사람들의 상속된 구성원 내 지식으로,당신이 할 수 있어야에서 숨길 IntelliSense 사용 EditorBrowsableAttribute:

Using System.ComponentModel;

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

편집: 다만 본 문서에 댓글을 만드는,그것을 좀 쓸모없는 이 목적을 위해:

가 눈에 띄는 참고는 미국 이 특성은"억제하지 않는 회원은 클래스에서는 같은 어셈블리".그것은 사실이지만 완전하지 않습니다.실제로,특성을 억제하지 않는 회원은 클래스에서는 동일한 솔루션입니다.

하나의 잠재적인 정보가 포함되어 있습니다 포함합체보다는 확장에서 다른 클래스입니다.이것은 당신에게 가장 유연성 측면에서는 노출의 당신이 원하는 것을 노출시키지만,절대적으로 필요한 경우에는 개체의 유형이 없는 이상적인 솔루션을(당신이 그러나 노출될 수 있는 객체에서 getter).

따라서:

public class MyClass : BaseClass
{
    // Your stuff here
}

가:

public class MyClass
{
    private BaseClass baseClass;

    public void ExposeThisMethod()
    {
        baseClass.ExposeThisMethod();
    }
}

또:

public class MyClass
{
    private BaseClass baseClass;

    public BaseClass BaseClass
    {
        get
        {
            return baseClass;
        }
    }
}

나는 당신이 가장 이상 hackish 방법을 고려한 구성과 반대로 유산입니다.

또는,당신은 당신을 만들 수 있는 인터페이스가 있는 회원은 당신이 원하는 파생된 클래스를 구현하는 인터페이스,프로그램에 대한 인터페이스입니다.

내가 알고있었습니다 여러 개의 답변을,이것은 그리고 그것은 확실히 오래된 지금,하지만 가장 간단한 방법이 선언대로 그들을 new private.

예를 들어 나는 현재 작업에,내가 있는 API 를 사용할 수 있는 모든 방식에서 제 3 자 DLL.나 자신의 방법만을 사용하고 싶다.순성,대신에"getThisValue"및"setThisValue"방법입니다.그래서,저는 빌드 두 번째 클래스를 상속 첫째,를 사용하는 속성을 얻을 설정 방법,그리고 다음 재정의 원본을 얻을하고 설정하는 방법으로 개인이다.그들은 여전히 누구나 사용할 수 있을 구축하고자하는 다른 무언가가 그들에,하지만 그들은 단지고 싶은 사용하여 엔진 내가 건축한 다음,그들이 할 수 있는 속성을 사용하여는 대신 방법입니다.

를 사용하여 더블 클래스 메소드를 제거해에 대한 제한되는 사용할 수 없 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 내부만을 노출 내 상속받은 클래스.

을 완전히 숨기기와 마크를 사용하지 않을 포함 intellisense 내가 믿는 것은 무엇 대부분의 독자들이 기대하...

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

테스트의 모든 제안된 솔루션과 그들은 정말이 숨기는 새로운 멤버입니다.

그러나 이것은:

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

하지만 코드 behide 그것은 여전히 접근할 수 있도록 추가로 사용되지 않는 특성

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

당신이 사용할 수 있는 인터페이스

    public static void Main()
    {
        NoRemoveList<string> testList = ListFactory<string>.NewList();

        testList.Add(" this is ok ");

        // not ok
        //testList.RemoveAt(0);
    }

    public interface NoRemoveList<T>
    {
        T this[int index] { get; }
        int Count { get; }
        void Add(T item);
    }

    public class ListFactory<T>
    {
        private class HiddenList: List<T>, NoRemoveList<T>
        {
            // no access outside
        }

        public static NoRemoveList<T> NewList()
        {
            return new HiddenList();
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top