Поскольку «Определенные пользователем преобразования в производный класс или из него не разрешены», есть ли в моей ситуации достойная альтернатива?

Мое приложение для съемки имеет класс Vector, наследующий от класса Matrix, который предоставляет операции, соответствующие 1D матрицам векторного типа. Вероятно, кто-то попытается свести матрицу к вектору, хотя базовый массив не является одномерным. Тогда они не будут знать, что есть проблема, пока исключение не произойдет по дороге в одной из операций с Vector. Но если я попытаюсь реализовать актерский состав,

public static explicit operator Vector3(Matrix m)
{
   if (m.Array.GetLength(0) != 3 && m.Array.GetLength(1) != 1)
       throw new InvalidCastException("The matrix dimensions are invalid.");
   return new Vector3(m[0, 0], m[1, 0], m[2, 0]);
}

Я получаю исключение из названия. Есть ли способ избежать этого?

2
nl ja de

1 ответы

Иерархия вашего типа проблематична. Vector не следует наследовать от Matrix в первую очередь - это еще одно взятие классического проблема круга/эллипса .

Кроме того, приведение Matrix к Vector в текущей иерархии происходит вниз. Downcasting никогда не гарантируется в безопасности, поэтому ваши пользователи должны ожидать , что приведение может закончиться неудачей. Вы не должны пытаться покрыть это, даже если бы вы как-то могли.

Наконец, нет ничего, что помешало бы вам предоставить метод AsVector3() , чтобы сделать то, что делает предлагаемый оператор преобразования.

3
добавлено
@BrandonArnold: На самом деле это означало, что «не все матрицы являются векторами», что, конечно же, не описывает вашу иерархию. Поэтому давайте притворимся, что эта часть так и не состоялась. ;-)
добавлено автор Jon, источник
Спасибо за компетентный ответ. Какой вектор не является матрицей?
добавлено автор Brandon Arnold, источник
Ха-ха, о, я вижу.
добавлено автор Brandon Arnold, источник
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)