от
Я ищу способ, чтобы эффективно скрывать унаследованные члены. У меня есть библиотека классов, которые наследуют от общего базового класса. Некоторые из более поздних классов потомок наследует свойства зависимостей, которые стали рудиментарным и может быть немного запутанным при использовании IntelliSense или с помощью классов в визуальном конструкторе. Эти классы являются все элементы, которые написаны, чтобы быть скомпилирован для WPF и Silverlight 2.0. Я знаю о
ICustomTypeDescriptor
и
ICustomPropertyProvider
, но я уверен, что они не могут быть использованы в Silverlight. Это не столько функциональная проблему как проблему юзабилити. Что я должен делать? Обновление Некоторые из свойств, которые я бы очень хотел, чтобы скрыть исходят от предков, что не мой собственный, а из-за специфического инструмента, которые я делаю, я не могу сделать член скрывается с оператором
new
. (Я знаю, это смешно)

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

9 Ответы

0 голосов
от
Я ищу способ, чтобы эффективно скрывать унаследованные члены. У меня есть библиотека классов, которые наследуют от общего базового класса. Некоторые из более поздних классов потомок наследует свойства зависимостей, которые стали рудиментарным и может быть немного запутанным при использовании IntelliSense или с помощью классов в визуальном конструкторе. Эти классы являются все элементы, которые написаны, чтобы быть скомпилирован для WPF и Silverlight 2.0. Я знаю о
ICustomTypeDescriptor
и
ICustomPropertyProvider
, но я уверен, что они не могут быть использованы в Silverlight. Это не столько функциональная проблему как проблему юзабилити. Что я должен делать? Обновление Некоторые из свойств, которые я бы очень хотел, чтобы скрыть исходят от предков, что не мой собственный, а из-за специфического инструмента, которые я делаю, я не могу сделать член скрывается с оператором
new
. (Я знаю, это смешно)
0 голосов
от
Переопределить их, как Майкл предполагает, выше и, чтобы предотвратить людей от использования переопределенных (СП?) методы, пометить их как устаревшие:
[Obsolete("These are not supported in this class.", true)]
public override  void dontcallmeanymore()
{
}
Если второй Парм имеет значение true, то ошибка компилятора будет создан, если кто-то пытается вызвать этот метод и строку в первом Парм это сообщение. Если parm2 ложно будет создан только предупреждение компилятора.
0 голосов
от
Хотя вы не можете предотвратить использование унаследованных членов моих знаний, вы должны быть в состоянии скрыть их от IntelliSense, используя атрибут editorbrowsableattribute:
Using System.ComponentModel;

[EditorBrowsable(EditorBrowsableState.Never)]
private string MyHiddenString = "Muahahahahahahahaha";
Редактировать: только что видел это в документации замечания, которые делает его довольно бесполезным для этой цели: Видно отметить, что государства, что этот атрибут "не подавляет члены класса в одной сборке". Это верно, но не полно. На самом деле, атрибут не подавляет членов класса в том же решении.
0 голосов
от
Одним из возможных, что вы можете сделать-это содержать объект, а не исходят из другого класса. Это даст вам большую гибкость в плане раскрытия того, что вы хотите выставить, но если вы абсолютно необходимо объекта быть, что типа это не идеальное решение (однако вы можете выставлять объект из геттер). Таким образом:
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;
        }
    }
}
0 голосов
от
Я думаю, ты лучше бы программистские способ-рассмотреть состав в отличие от наследования. Или, вы могли бы создать интерфейс, который имеет членов, которые вы хотите, ваш производный класс реализует этот интерфейс, и программы от интерфейса.
0 голосов
от
Я знаю, что есть несколько ответов на это, и теперь довольно старый, но самый простой способ сделать это-просто объявить их как
new private
. Рассмотрим пример, в настоящее время я работаю, где у меня есть API, который делает доступными каждому методу в 3-й партии dll файлы. Я должен взять свои методы, но я хочу использовать .Чистая собственность, вместо "getThisValue" и "setThisValue" способ. Так что я построить второй класс, наследовать во-первых, сделать свойство, которое использует методы 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 =
0 голосов
от
Чтобы полностью скрыть и Марк не использовать, включая IntelliSense, которая я полагаю, что большинство читателей ожидают ...
[Obsolete("Not applicable in this class.")] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
0 голосов
от
Я тестировал все предлагаемые решения, и они действительно не скрывают новых членов. Но никто этим:
[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; }
}
0 голосов
от
Вы можете использовать интерфейс
    public static void Main()
    {
        NoRemoveList
...