2008-10-01 2 views
6

Что такое реалистичное использование ключевого слова MyClass VB.Net?MyClass в VB.Net

Я понимаю technical usage of MyClass; Я не понимаю его практическое использование в реальном мире.

Использование MyClass имеет смысл только в том случае, если у вас есть виртуальные (переопределяемые) элементы. Но это также означает, что вы хотите игнорировать переопределенные реализации в подклассах. Это кажется противоречивым.

Я могу придумать некоторые надуманные примеры, но они просто плохой дизайн, а не практическое использование.

ответ

1

MyClass, с точки зрения компилятора, это способ опустить callvirt инструкцию в пользу call инструкции. По сути, когда вы вызываете метод с виртуальной семантикой (callvirt), вы указываете, что хотите использовать наиболее производные вариации. В случаях, когда вы хотите опустить производные вариации, вы используете MyClass (call). Хотя вы заявили, что понимаете основную концепцию, я полагал, что это может помочь описать ее с функциональной точки зрения, а не подразумевать понимание. Он функционально идентичен MyBase с предостережением объема, являющимся базовым типом с MyBase, вместо активного типа с MyClass.

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

Это все о дизайне, понимании общего дизайна и угловых корпусов. Вероятно, причина в том, что C ♯ не включает такую ​​функциональность, поскольку в этих угловых случаях вы можете разделить метод на частный вариант, который текущий уровень в иерархии вызывает, и просто ссылаться на эту частную реализацию, когда это необходимо.Моя личная точка зрения заключается в том, что использование подхода сегментации - идеальное средство для достижения цели, поскольку оно явно говорит о вашем выборе дизайна, и его легче отслеживать (и оно также является единственным действительным средствами на языках без функционального эквивалента MyClass.)

+0

Спасибо, что ответили на мой 5-летний вопрос :) Я думаю, что «неправильный выбор дизайна» - это ответ; приватный закрытый/публичный виртуальный кажется намного лучше. – 2013-10-01 15:57:08

-1

Я думаю, что единственный случай, который я мог бы использовать для него, был бы, если бы вы хотели получить базовое условие и унаследованное условие одновременно? И.Е. где вы хотите унаследовать участника, но хотите получить доступ к значению для этого члена, который не был изменен наследованием?

+0

то почему бы позволить этому члену переопределить в первую очередь? – 2008-10-10 13:37:16

1

полиморфизм

Я сожалею, что не ясный пример кода здесь, но вы можете по ссылке ниже для этого, и я не хочу скопировать описание MSDN Library, но это так хорошо, что это очень трудно переписывайте его все яснее.

«MyClass предоставляет способ обращения к текущим членам экземпляра класса без замены их переопределениями производных классов. Ключевое слово MyClass ведет себя как переменная объекта, относящаяся к текущему экземпляру класса, как первоначально реализовано».

Также обратите внимание, что вы не можете использовать MyClass в совместно используемом методе.

Хороший пример реализации полиморфизма через MyClass находится в http://www.devarticles.com/c/a/VB.Net/Implementing-Polymorphism-in-VB.Net/

+0

Вы цитируете «MyClass предоставляет способ ссылаться на текущие члены экземпляра класса, не заменяя их на переопределения производных классов». Тогда зачем маркировать своих членов как переопределяемые в первую очередь? – 2008-10-05 15:17:20

-3

Вам это нужно, если вы хотите вызвать прикован конструктор.

Public Sub New(ByVal accountKey As Integer) 
    MyClass.New(accountKey, Nothing) 
End Sub 

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String) 
    MyClass.New(accountKey, accountName, Nothing) 
End Sub 

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String, ByVal accountNumber As String) 
    m_AccountKey = accountKey 
    m_AccountName = accountName 
    m_AccountNumber = accountNumber 
End Sub 
+0

Nope; Me.New (...) или MyBase.New (...) будет работать нормально. – 2008-10-05 15:14:40

Смежные вопросы