Переопределение Свойства ReadOnly в подклассе для создания этого Чтением-записью (VB.NET или C#)

Библиотеки создаются в инструменте, а не в самом VHDL. Например, в modelsim библиотеки создаются с помощью команды vlib, например.

vlib my_library;

В VHDL вы можете включить свою библиотеку в любой регион с помощью команды библиотеки, а объекты (например, пакет) можно включить с помощью команды use:

library my_library;
use my_library.some_package.all;
6
задан KyleMit 2 February 2015 в 13:24
поделиться

6 ответов

Учитывая то, что Вы пытаетесь выполнить, и с примером кода, который Вы отправили, VB.NET не позволит Вам сделать это.

Обычно, можно объявить свойство в VB.NET как так:

Public Class qwqwqw
  Public Property xyz() As String
      Get
          Return ""
      End Get
      Private Set(ByVal value As String)
          '
      End Set
  End Property
End Class

В основном отмечая общее свойство как общественность, но давая более строгий объем методу set (или метод считывания).

Основной проблемой в Вашем случае является MustInherit (т.е. краткий обзор) базовый класс. Так как свойство, которое Вы определяете там, отмечено как MustOverride, Вы не можете обеспечить реализацию по умолчанию (т.е. это также абстрактно), и это включает основы "Получения" и "Набора", поэтому, какой бы ни "полный" объем, который Вы даете этому абстрактному объявлению свойства, VB.NET, вынудит Вас использовать этот объем и для методов считывания и для методов set в производных классах.

Наличие спецификатора ReadOnly на свойстве базового класса вынудит все производные классы и реализации этого свойства также быть ReadOnly. Бросание спецификатора ReadOnly все еще не будет работать, с тех пор независимо от того, что объемом, который Вы даете абстрактному свойству, будет объем, необходимо обратиться и к методам set и к методам считывания в рамках полученных реализаций.

Например:

Public MustInherit Class Parent
  Public MustOverride Property Foo() As String
End Class

Public Class ReadOnlyChild
  Inherits Parent

  Public Overrides Property Foo() As String
    Get
        '
    End Get
    Private Set(ByVal value As String)
        '
    End Set
  End Property
End Class

(Отметьте Частный обзор на методе set). Это не будет работать, поскольку VB.NET настаивает, чтобы, так как Вы переопределяете свойство базовых классов, Ваше все свойство имело тот же объем как свойство, которое Вы переопределяете (в этом случае, общественность).

Попытка сделать абстрактное свойство базового класса защищенным не будет работать также, так как Вы были бы затем обязаны реализовывать свойство на том же уровне обзора, как это объявлено в Вашем базовом классе (т.е. защищено). Обычно, если не переопределяя абстрактное определение базового класса с определенным уровнем обзора, можно дать методу считывания или методу set более строгий уровень обзора, но Вы не можете дать ему менее строгий уровень обзора.

Поэтому:

Public MustInherit Class Parent
  Protected MustOverride Property Foo() As String       
End Class

Public Class ReadOnlyChild
  Inherits Parent

  Protected Overrides Property Foo() As String
      Public Get
          '
      End Get
      Set(ByVal value As String)
          '
      End Set
  End Property
End Class

(Отметьте общедоступный обзор на методе считывания). Не работает ни один из-за общедоступного объема, являющегося менее строгим, чем объем общего свойства защищенных, и кроме того, не того же уровня обзора, как определено на абстрактном объявлении свойства базового класса.

Если дизайн Ваших классов - как Вы упоминаете в своем вопросе, я лично, пошел бы со "стилем Java" методы получателя и методы установщика, поскольку они могут затем быть объявлены отдельно с их собственными уровнями обзора.

6
ответ дан 9 December 2019 в 22:40
поделиться

Могло бы быть крайне рискованное..., учитывая, что мое знание VB.NET минимально...

В C# можно указать видимость средства доступа свойства независимо от свойства:

public virtual string Name
{
    get { ... }
    protected set { ... }
}

В этом примере дочерние классы могут получить доступ к методу set, но другие классы не могут.

Также обратите внимание, что переопределения могут иметь большую видимость, чем, что они переопределяют - таким образом, можно сделать это:

public overide string Name
{
    get { ... }
    public set { ... }
}

Вы могли сделать что-то вроде этого в VB.NET?

3
ответ дан 9 December 2019 в 22:40
поделиться

Подтвердите, что MrEdmuno корректен в этом, можно использовать Тень. Однако кажется, что Вы не можете непосредственно теневой что-то, что является отмеченным MustInherit, таким образом, необходимо наследоваться в класс (Родительские 2)... затем в только для чтения (на самом деле думающий об этом, Вы, вероятно, не должны использовать тени, если Вы наследовались в класс),

Я думаю, что мой вопрос о комментарии все еще стоит, почему необходимо сделать это? Если бы они - Ваши собственные классы, Вы были бы лучше для изменения их или реализации как интерфейс?

Public MustInherit Class Parent

    Public MustOverride ReadOnly Property Foo() As String

End Class

Public Class ReadOnlyChild
    Inherits Parent

    Public Overrides ReadOnly Property Foo() As String
        Get
            'Get the Property
            Return "Return"
        End Get
    End Property

End Class

Public Class Parent2
    Inherits Parent

    Public Overrides ReadOnly Property Foo() As String
        Get
            Return "Return 2"
        End Get
    End Property
End Class

Public Class ReadWriteChild
    Inherits Parent2

    Public Shadows Property Foo() As String
        Get
            '// Get the property.
            Return "2"
        End Get
        Set(ByVal value As String)
            '** Set something
        End Set
    End Property
2
ответ дан 9 December 2019 в 22:40
поделиться

Unfortunatly, на котором у меня нет Visual Studio здесь, таким образом, я не могу подтвердить.

Вы посмотрели на использование Теней, это - effectivly то же что "новый" в объявлении свойства C#.

0
ответ дан 9 December 2019 в 22:40
поделиться

Чтобы решить, что предложил Беван, в VB.NET вы можете объявить свойство как имеющее общедоступный метод получения и защищенный метод установки следующим образом:

Private _ExpectedTotalRoyalties As Decimal

Public Property ExpectedTotalRoyalties() As Decimal
    Get
        Return _ExpectedTotalRoyalties
    End Get
    Protected Set(ByVal value As Decimal)
        If Not _ExpectedTotalRoyalties.Equals(value) Then
            _ExpectedTotalRoyalties = value
            SendPropertyChanged("ExpectedTotalRoyalties")
        End If
    End Set
End Property
0
ответ дан 9 December 2019 в 22:40
поделиться

Не пытайтесь переопределить свойство, поскольку оно не является виртуальным. Переопределите методы OnReadOnlyChanged и решайте свои проблемы там. Удачи

0
ответ дан 9 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: