109: (animated-1)
[personal profile] 109
у меня дофига статических generic классов, а также статических классов, в которых полно generic методов. под generic я имею в виду "имеющие type parameters" - ну вот это, с угловыми скобочками, you know. и использовать мне всё это очень удобно до тех пор, пока не возникает семейство - то есть, в традиционной миссионерской позиции надо было бы создать abstract parent class, засунуть туда общее, пронаследоваться, заимплементить специфику в потомках.

но, блядь, как известно, статический класс не может быть абстрактным, и от него нельзя пронаследоваться. не потому, что с абстрактными статическими классами есть какая-то логическая неувязка - нет, никакой неувязки нет в том, чтобы в родителе написать static protected abstract int GetNumber(), а в потомке - static protected override int GetNumber() { return 42; }. и использовать этот GetNumber() там в родителе, где живёт общая для всех потомков логика, использующая этот number. всё это отлично же резолвится во время компиляции, даже double dispatch не надо.

а потому что, блядь, создатели языка решили, что это будет слишком сложно для восприятия. та же причина, по которой у инстанса типа нельзя вызвать его статический метод. в object паскале можно, а тут, блядь, нельзя. monadic types с биндом, блядь, для них не слишком сложно, а это, блядь, слишком.

поэтому в таких случаях приходится писать обычные, не-статичеcкие классы, но без стейта, и заводить в клиентском классе статическое поле, чтобы не делать бессмысленное new каждый раз.

это, пожалуй, чуть ли не единственная претензия к сишарпу. ну и ещё ref/out параметры нельзя засовывать в лямбды. какого хрена? главное, что руками это "ограничение" обходится в три лишние строчки, но зачем меня заставлять эти три строчки каждый раз писать? да и не в писать дело, читать потом противно.

(no subject)

Date: 2013-05-10 11:42 pm (UTC)
wizzard: (photo24)
From: [personal profile] wizzard
есть такая лажа, всяко согласен

(no subject)

Date: 2013-05-11 05:16 am (UTC)
From: [identity profile] metaclass.livejournal.com
О блин, я думал, отсутствие виртуальных статических методов и методов классов одного меня бесит, после дельфей.

(no subject)

Date: 2013-05-11 04:21 pm (UTC)
From: [identity profile] selfmade.livejournal.com
мне кажется, что они постепенно уберут эти ограничения. Раньше вон и дженериков не было, и расширений.

(no subject)

Date: 2013-05-11 05:16 pm (UTC)
From: [identity profile] duginov.livejournal.com
А как ты потом юнит тесты для потребителей этих статических классов/методов пишешь? :)

(no subject)

Date: 2013-05-11 06:22 pm (UTC)
From: [identity profile] mstone.livejournal.com
1. В гипотетическом наследовании статических классов: если "виртуальный" GetNumber() вызывается из "обычного" метода Foo() базового класса, как компилятор догадается, что надо вызывать наследниковый GetNumber()? По имени класса, которым квалифицирован вызов Foo()?

2. Зачем в клиентском классе статическое поле? Если класс X без стейта, ему можно завести статическую проперть public static X Instance = new X() и пользовать её изо всех клиентских классов через X.Instance.

У меня, при нежной любви к C#, претензий побольше. Две главные:
- Отсутствие поддержки immutable типов. Количество бойлерплейт-кода зашкаливает настолько, что уже дозрел до написания кодогенератора вроде такого.
- Отсутствие интерпретатора. Это вообще ёбаный стыд: в винде до сих пор нету стандартного вменяемого скриптового языка, при том что C# -- готовый почти идеальный кандидат.

(no subject)

Date: 2013-05-11 06:55 pm (UTC)
From: [identity profile] 109.livejournal.com
1. да
2. два глухих: ты в баню? нет, я в баню. а, я думал, ты в баню.

есть powershell. есть immutable коллекции. хотя, согласен, immutable типов не хватает.

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags