Здравствуйте, criosray, Вы писали:
C>Здравствуйте, 0xC0000005, Вы писали:
C>(бред г-на с хацкерским ником вырезан цензурой)
Никогда не думал что код ошибки доступа к памяти известен лишь хацкерам, печально...
C>Дотнет и джава прекрасно обходятся без недоразумения под названием "множественное наследование". boost и stl по структуре и удобству смотряться очень и очень бедно на фоне .NET Framework.
Итак начнём с реального примера, представте себе ОО дизаин, в котором есть ядро и то что доделывает сам клиент у себя, клиент не может менять код ядра, а только насоедовать классы, менять некоторый функционал и подменять core класс своим в рантайм. Так вот есть структура:
ClassA
| \
ClassB ClassC
/|\
ClassB1 ClassB2 ClassB3
В класс Α необходимо добавить один метод, если вы унаследуете от А, то он подменится, НО потомки оригинального А всё равно будут юзать оригинального родителя.
При множественном наследовании данная зада решается очень просто всего одним классом, думаю вам как мега-кодеру не надо примеров. На ненастоящих языках все все потомки которые не абстрактные должны добавить этот метод. Тут ещё убирается нафиг полиморфизм и новые костыли вставляются в код.
C>Множественное наследование такой же моветон, как и goto.
А у вас смотрю стиль автора текста, хотите так же о шарпе? Утка это так же тупо как аддресс функции, Делегация это так же наивно как сдвиг в сегменте
C>>А много ли явошарпы знают удобных, простых и "интуитивно" понятных способов расширить функционал языка? Вот у меня требование к либе, я хочу регить callbackи вот таким способом: C>>alarmNotifier = GUIHandler::onAlarm + CoreRoutine::onAlarm C>>и что? у вас есть "костыль"? или всё чего нету нам не надо? Ха, это мертвецки неправильно, и обычно такое отмирает как несовершенное. C>То, что есть у Вас еще бОльший костыль.
C>obj.Alarm += OnAlarm; C>obj.Alarm += (arg1, arg2) => { /* обработчик здесь */ };
Вы видимо не поняли мой пример из-за его простоты, я хотел спрятать рутину обработчиков итп вещей.
C>Что до расширяемых .NET языков — смотрите Nemerle и Boo.
Я не говорю о других языках, я говорю о расширении в рамках одного языка, или Немерил с Бу компилятся родным шарповским компилятором?
C>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете: C>>logger::log(__filename__, __line__, "log text")
C>
C>catch(Exception e) {
C> Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C> throw;
C>}
C>
А вот это красота которую я от вас ожидал Как меня достали эти криворучки, которые думают что кинуть в лог всё что можно из стека это так круто, ведь там разберуться.
Вы опять кинули мне пример готового тёплого коричневого батончика, я просил номер строки, вы кинули весь Stack Trace, я знаю что это такое, и я знаю что взять стэк вызовов в С++ не составляет проблем.
А как взять имено номер строки в файле? Или это бага щарпа ещё не разработана?
Или в новой версии появится printFileAndLine и вы будете выдирать и парсить номер строки? Ах скока кода я перевидал с такими заплатками
C>И Вы осмеливались утверждать, что Вы что-то знаете об управляемых языках? Да уж по части логеров управляемые языки рвут неуправляемые (в т.к. С++), как тузик — грелку. Вам только мечтать об удобстве отладки и логирования, предоставляемых средствами управляемых сред.
Я осмеливаюсь утверждать что за такой код я бы вас уволил, будь то Ява или Шарп или Плюсы, этот стиль называется есть ошибка — нет ошибки.
А ЕСЛИ это не исключение?
C>>Ага, а теперь скажите мне, у меня огромный обьект, но я хочу сериализовать только, замете слово ТОЛЬКО хидеры во всей иерархий, вот так я это использовал: C>>dataStream << Modifiers::HeadersOnly << hugeObject;
C>Сериализация в дотнет полностью управляется атрибутами. В С++ об этом опять же только мечтать.
C>
C> [JsonObject(MemberSerialization.OptIn)]
C> public class LoginResult
C> {
C> private ResultErrors errors = new ResultErrors();
C> [JsonProperty("success")]
C> public bool Success { get; set; }
C> [JsonProperty("errors")]
C> public ResultErrors Errors
C> {
C> get { return errors; }
C> }
C> }
C>
Не не не дядя, ты не понял меня, есть класс который тебе дал один мужик, и надо его сериализовать для бор машинки другого дяди, ты тут всего-то один программер в большом проекте, а не Вася Пупкин с проектом Хелло Бил где можно менять всё что под руку попало, Слабо повторяю?
C>Вы сначала заставьте это компиллироваться под С++
C>>public <T> void f() C>>{ C>> T t = new T(); C>> t.f(); C>>}
Под плюсы подобный код? Давайте прямо так навскидку с компиляцией
template<class T>
void f()
{
T t;
t.f();
}
class A
{
public:
void f(){}
};
int main()
{
f<A>();
return 0;
}
Компилится, работает.
C>>Вот скажите мне серьёзно, хоть один реальный пример в рамках одного приложения(про распределённые системы отдельный разговор), когда на этапе компиляции тип обьекта не известен, а если он известен, то зачем его узнавать? Потеряли — плохой дизайн и кучерявые руки!!! + обрезанность языка. C>COM
КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE
C>>
C>>void func1 ( A& a );
C>>void func2 ( A a );
C>>В чем разница между этими описаниями (кроме того, что возможно программист просто пропустил символ '&') ?
C>>а в чём разница между func1(a) и func1(a.clone()), в том что в первом варианте кодер забыл вызвать клон C>>А как передать строку в Яве, чтобы она была output parameter? Вот смеху то, надо создавать холдеры, и почему в яве
C>Ну давайте вспомним строки — самое больное место С++, чтоб забить последний гвоздь в гроб этого языка.
C>>
C>>переданный параметр не поменяется? и Вообще ни один параметр не поменяется? ах сколько говна было сьедено на этом миллионами программистами и тестерами. И вы говорите о том что управляемые языки там просты? C>Миллионами индусокодеров?
C>Опять же, в С# есть out параметры.
C>А уж если кидаться какашками, то давайте вспомним в С/С++ классическую ошибку: C>if (a = 1) { ... }
C>об которую спотыкаются даже опытные программисты. Что заставляет многих применять костыль:
C>if (1 == a) { ... }
C>А уже про миллионы проблем, связанных с десятками реализаций строк и работы со строками в С++ на Вашем месте я б скромно умолчал.
Это хорошо что в шарпах есть аут параметры, хоть чего-то увидели в ошибках Явы.
А как строки относятся к языку? Этож не паскаль
и чем вам std::string не строка, когда-то веб сервак делал заточенный под одного клиента, так там все буфера отлично на этих строках работали.
C>>TO BE CONTINUED!!! C>Не позорьтесь так больше.
Ну к вам это более применимо, 2 неправильных примера и незнание тематики (на С++ это не компилится итп)
C>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".
C>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.
C>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.
Многа букаф и ничего по существу.
C>>>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете: C>>>>logger::log(__filename__, __line__, "log text")
C>>>
C>>>catch(Exception e) {
C>>> Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>>> throw;
C>>>}
C>>>
CC>>А ничего что то, что ты написал к logger::log(__filename__, __line__, "log text") не имеет вообще никакого отношения даже близко. C>Конечно имеет. Но если хотите один в один, то ради бога: C>Log.Info("log text");
А кто просил время выводить? По рукам, по рукам и никакой премии, хакер узнал лишнюю инфу из пользовательского лога, вы уволены.
C>>(бред г-на с хацкерским ником вырезан цензурой)
C>Никогда не думал что код ошибки доступа к памяти известен лишь хацкерам, печально...
Не только, но только "кулхацкеры" вбирают себе в качестве ника "код ошибки доступа к памяти в 16ричном формате".
C>>Дотнет и джава прекрасно обходятся без недоразумения под названием "множественное наследование". boost и stl по структуре и удобству смотряться очень и очень бедно на фоне .NET Framework.
C>Итак начнём с реального примера, представте себе ОО дизаин, в котором есть ядро и то что доделывает сам клиент у себя, клиент не может менять код ядра, а только насоедовать классы, менять некоторый функционал и подменять core класс своим в рантайм. Так вот есть структура: C>ClassA C> | \ C>ClassB ClassC C>/|\ C>ClassB1 ClassB2 ClassB3
C>В класс Α необходимо добавить один метод, если вы унаследуете от А, то он подменится, НО потомки оригинального А всё равно будут юзать оригинального родителя.
C>При множественном наследовании данная зада решается очень просто всего одним классом, думаю вам как мега-кодеру не надо примеров. На ненастоящих языках все все потомки которые не абстрактные должны добавить этот метод. Тут ещё убирается нафиг полиморфизм и новые костыли вставляются в код.
Не надо тут никакого многожественного наследования:
СlassA
|
OpenForModificationsClassA — добавляем методы сюда
| \
ClassB СlassC
/ | \
C>>Множественное наследование такой же моветон, как и goto.
C>А у вас смотрю стиль автора текста, хотите так же о шарпе? Утка это так же тупо как аддресс функции, Делегация это так же наивно как сдвиг в сегменте
Что не так с моим стилем? Это давно известный факт, что множественное наследование — источник великого множества проблем и что решение "единичное наследование + множественная реализация интерфейсом" является гораздо более оптимальным и дотнет фреймворк есть тому прямое доказательство.
C>>>А много ли явошарпы знают удобных, простых и "интуитивно" понятных способов расширить функционал языка? Вот у меня требование к либе, я хочу регить callbackи вот таким способом: C>>>alarmNotifier = GUIHandler::onAlarm + CoreRoutine::onAlarm C>>>и что? у вас есть "костыль"? или всё чего нету нам не надо? Ха, это мертвецки неправильно, и обычно такое отмирает как несовершенное. C>>То, что есть у Вас еще бОльший костыль.
C>>obj.Alarm += OnAlarm; C>>obj.Alarm += (arg1, arg2) => { /* обработчик здесь */ };
C>Вы видимо не поняли мой пример из-за его простоты, я хотел спрятать рутину обработчиков итп вещей.
Объясните.
C>>Что до расширяемых .NET языков — смотрите Nemerle и Boo.
C>Я не говорю о других языках, я говорю о расширении в рамках одного языка, или Немерил с Бу компилятся родным шарповским компилятором?
Зачем? Язык абсолютно не важен. Дотнет сборки Nemerle и Boo (С#, VB.NET, F# и т.д. — любом дотнет языке) подключаются к любому дотнет проекту. Интеграция полностью прозрачная.
C>>
C>>catch(Exception e) {
C>> Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>> throw;
C>>}
C>>
C>А вот это красота которую я от вас ожидал Как меня достали эти криворучки, которые думают что кинуть в лог всё что можно из стека это так круто, ведь там разберуться.
Не понял полета мысли. Что значит "все, что можно из стека"? Естественно, при логировании имеет смысл писать в лог максимум информации. Что не так?
C>Вы опять кинули мне пример готового тёплого коричневого батончика, я просил номер строки, вы кинули весь Stack Trace, я знаю что это такое, и я знаю что взять стэк вызовов в С++ не составляет проблем.
Нет, Вы не знаете что такое StackTrace. Открою Вам глазки:
StackTrace stackTrace = new StackTrace(true);
var frame = stackTrace.GetFrame(1);
frame.GetFileColumnNumber();
frame.GetFileLineNumber();
frame.GetFileName();
frame.GetILOffset();
frame.GetMethod();
frame.GetNativeOffset();
Еще вопросы будут?
C>А как взять имено номер строки в файле? Или это бага щарпа ещё не разработана? C>Или в новой версии появится printFileAndLine и вы будете выдирать и парсить номер строки? Ах скока кода я перевидал с такими заплатками
Рассказывайте свои фантазии в другом месте, ок.
C>>И Вы осмеливались утверждать, что Вы что-то знаете об управляемых языках? Да уж по части логеров управляемые языки рвут неуправляемые (в т.к. С++), как тузик — грелку. Вам только мечтать об удобстве отладки и логирования, предоставляемых средствами управляемых сред.
C>Я осмеливаюсь утверждать что за такой код я бы вас уволил, будь то Ява или Шарп или Плюсы, этот стиль называется есть ошибка — нет ошибки.
Что значит есть — нет? Вы throw не заметили? Так это Вас, а не меня увольнять надо.
C>А ЕСЛИ это не исключение?
Что "это"? сatch(Exception e) ловит все исключения (т.к. он является базовым классом для классов исключений в дотнет). Не знали об этом?
Можно конечно прицепиться, что делать сatch (Exception e) {} тоже моветон, но я привел этот код как простейший пример. Если не нравится, то можно переписать
Cути это не поменяет.
C>>>Ага, а теперь скажите мне, у меня огромный обьект, но я хочу сериализовать только, замете слово ТОЛЬКО хидеры во всей иерархий, вот так я это использовал: C>>>dataStream << Modifiers::HeadersOnly << hugeObject;
C>>Сериализация в дотнет полностью управляется атрибутами. В С++ об этом опять же только мечтать.
C>>
C>> [JsonObject(MemberSerialization.OptIn)]
C>> public class LoginResult
C>> {
C>> private ResultErrors errors = new ResultErrors();
C>> [JsonProperty("success")]
C>> public bool Success { get; set; }
C>> [JsonProperty("errors")]
C>> public ResultErrors Errors
C>> {
C>> get { return errors; }
C>> }
C>> }
C>>
C>Не не не дядя, ты не понял меня, есть класс который тебе дал один мужик, и надо его сериализовать для бор машинки другого дяди, ты тут всего-то один программер в большом проекте, а не Вася Пупкин с проектом Хелло Бил где можно менять всё что под руку попало, Слабо повторяю?
И какие проблемы? Делаем DTO и атрибутами описываем какие поля сериализовать, какие — не сериализовать, какие сериализовать как атрибуты, а какие — как ноды (если речь о Xml-сериализации).
Кстати, как там с Xml-сериализацией в С++?
C>>Вы сначала заставьте это компиллироваться под С++
C>>>public <T> void f() C>>>{ C>>> T t = new T(); C>>> t.f(); C>>>}
C>Под плюсы подобный код? Давайте прямо так навскидку с компиляцией
class A : IAinterface
{
public void f() {}
}
internal interface IAinterface
{
void f();
}
class Program
{
static public void foo<T>() where T : IAinterface
{
var a = new A();
}
static void Main(string[] args)
{
foo<A>();
}
}
C>Компилится, работает.
Аналогично. При чем более выразительно, т.к. контракт, которому должна соответствовать специализация дженерика, указан явно.
C>>>Вот скажите мне серьёзно, хоть один реальный пример в рамках одного приложения(про распределённые системы отдельный разговор), когда на этапе компиляции тип обьекта не известен, а если он известен, то зачем его узнавать? Потеряли — плохой дизайн и кучерявые руки!!! + обрезанность языка. C>>COM
C>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE
Да при чем тут DCOM? Я говорю о классическом COM.
C duck typing (boo):
import System.Threading
def CreateInstance(progid):
type = System.Type.GetTypeFromProgID(progid)
return type()
ie as duck = CreateInstance("InternetExplorer.Application")
ie.Visible = true
ie.Navigate2("http://www.go-mono.com/monologue/")
Thread.Sleep(50ms) while ie.Busy
document = ie.Document
print("${document.title} is ${document.fileSize} bytes long.")
C>Это хорошо что в шарпах есть аут параметры, хоть чего-то увидели в ошибках Явы. C>А как строки относятся к языку? Этож не паскаль
Строка такой же базовый тип данных, как и int, double, bool, и т.д. Если этого не понимать, то получится тот зоопарк реализаций с миллионом граблей, который мы наблюдаем в С++.
C>и чем вам std::string не строка, когда-то веб сервак делал заточенный под одного клиента, так там все буфера отлично на этих строках работали.
Одна из реализаций. Как-там у нее с юникодом, кстати?
C>>>TO BE CONTINUED!!! C>>Не позорьтесь так больше. C>Ну к вам это более применимо, 2 неправильных примера и незнание тематики (на С++ это не компилится итп)
Каких примера, какой терминологии. Не стесняйтесь — выкладывайте.
C>>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".
C>>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.
C>>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.
C>Многа букаф и ничего по существу.
Конечно. Скот Майерс — С++ гуру будет писать не по существу. Куда уж ему до господина с кулхацкерским ником с кывта.
C>>>>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете: C>>>>>logger::log(__filename__, __line__, "log text")
C>>>>
C>>>>catch(Exception e) {
C>>>> Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>>>> throw;
C>>>>}
C>>>>
CC>>>А ничего что то, что ты написал к logger::log(__filename__, __line__, "log text") не имеет вообще никакого отношения даже близко. C>>Конечно имеет. Но если хотите один в один, то ради бога: C>>Log.Info("log text");
C>А кто просил время выводить? По рукам, по рукам и никакой премии, хакер узнал лишнюю инфу из пользовательского лога, вы уволены.
Ну не выводите. Формат лога настраивается как душе угодно. И какое вообще это имеет отношение к теме?
Здравствуйте, 0xC0000005, Вы писали:
C>>COM
C>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE
Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.
Хм. Misusing = моветон? У тебя снова какое-то странное прочтение. Можно в микроволновку сунуть домашнюю собаку, это ещё не означает, что микроволновка или домашняя собака — моветон.
C>http://www.gotw.ca/publications/mill06.htm
C>
C>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".
C>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.
C>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.
При чём тут множественное наследование? В процитированной тобой статье речь идёт о наследовании вообще.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
C>>А ЕСЛИ это не исключение? C>Что "это"? сatch(Exception e) ловит все исключения (т.к. он является базовым классом для классов исключений в дотнет). Не знали об этом?
Он о том, что запись в лог вызвана не в результате исключения или какой либо ошибки.
C>Аналогично. При чем более выразительно, т.к. контракт, которому должна соответствовать специализация дженерика, указан явно.
Пиписки оказались одинаковой длины.
C>>А как строки относятся к языку? Этож не паскаль C>Строка такой же базовый тип данных, как и int, double, bool, и т.д.
Неа. Это решать автору языка: базовый или не базовый.
C>Если этого не понимать, то получится тот зоопарк реализаций с миллионом граблей, который мы наблюдаем в С++.
Так уж и зоопарк, так уж и с миллионом.
Почему то больше всего граблей в С++ видят те, кто на нем либо никогда не писал либо писал очень давно.
C>Одна из реализаций. Как-там у нее с юникодом, кстати?
y wstring USC2 100% поддерживается
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, 0xC0000005, Вы писали:
C>У него было руководство по ООП — книга по паскалю. Занятно, как такой гений (как о нём тут шарписты шаркают) выбрал имено Паскаль 5.5, ведь в нём небыло обьектов, если помните Pascal with Objects был введён с версии 7.0 борландовсой ИДЕ [...]
Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, 0xC0000005, Вы писали:
C>>>
C>>>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".
C>>>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.
C>>>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.
C>>Многа букаф и ничего по существу.
C>Конечно. Скот Майерс — С++ гуру будет писать не по существу. Куда уж ему до господина с кулхацкерским ником с кывта.
Во первых переход на личности не показывает вас с лучшей стороны, во вторых я говорил о вашей цитате Майерса, а не о самой его цитате. То что вы впихнули сюда это, вот что не по существу, не поленитесь написать одинм-двумя предложениями в чём проблема С++ поддержки множественного наследования, а не множественного наследования такогого.
Поймите, что и С++ и Ява поддверживают множественное наследовние как таковое, только вот используют разные методы обхода ловушек, таких как двоиственность, С++ добавляет виртуальное наследование, Ява разрешает наследовать только от одного не абстрактного класса, а все остальные классы должны быть чисто абстрактными (ака интерфейс).
И какой-же геморой вас ждёт, когда интерфейс должен иметь один маленький метод.
C>>>>>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете: C>>>>>>logger::log(__filename__, __line__, "log text")
C>>>>>
C>>>>>catch(Exception e) {
C>>>>> Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>>>>> throw;
C>>>>>}
C>>>>>
CC>>>>А ничего что то, что ты написал к logger::log(__filename__, __line__, "log text") не имеет вообще никакого отношения даже близко. C>>>Конечно имеет. Но если хотите один в один, то ради бога: C>>>Log.Info("log text");
C>>А кто просил время выводить? По рукам, по рукам и никакой премии, хакер узнал лишнюю инфу из пользовательского лога, вы уволены. C>Ну не выводите. Формат лога настраивается как душе угодно. И какое вообще это имеет отношение к теме?
Так вот пишите то, о чем вас попросили, а не полёт фантазии на тему "Как это будет красивее"
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Хм. Misusing = моветон? У тебя снова какое-то странное прочтение. Можно в микроволновку сунуть домашнюю собаку, это ещё не означает, что микроволновка или домашняя собака — моветон. ГВ>При чём тут множественное наследование? В процитированной тобой статье речь идёт о наследовании вообще.
Я все больше склоняюсь к выводу, что под ником criosray скрывается флеймобот, с которым вообще невозможно конструктивно общаться.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, 0xC0000005, Вы писали:
C>>>COM
C>>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE
C>Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.
Давайте пробежимся по иерархий названий, но ActiveX, DCOM, OLE, DDE — это всё КОМ, и то что мелкомягкие называют новую версию не заставит меня называть одно другим, COM DDE
CORBA внук DDE, так вас больше устроит?
И говорив Внук я вовсе не имел ввиду что КОРБу сделали на основе КОМа, боже упаси, а вот по эволюции — КОМ это предшественник КОРБы
Здравствуйте, CreatorCray, Вы писали:
C>>>А ЕСЛИ это не исключение? C>>Что "это"? сatch(Exception e) ловит все исключения (т.к. он является базовым классом для классов исключений в дотнет). Не знали об этом? CC>Он о том, что запись в лог вызвана не в результате исключения или какой либо ошибки.
Какая разница?
C>>>А как строки относятся к языку? Этож не паскаль C>>Строка такой же базовый тип данных, как и int, double, bool, и т.д. CC>Неа. Это решать автору языка: базовый или не базовый.
Во всех нормальных языках так. Даже в Objective-C тип один единственный NSString — и никаких проблем с зоопарком строк, как в С++.
C>>Если этого не понимать, то получится тот зоопарк реализаций с миллионом граблей, который мы наблюдаем в С++. CC>Так уж и зоопарк, так уж и с миллионом. CC>Почему то больше всего граблей в С++ видят те, кто на нем либо никогда не писал либо писал очень давно.
Наверно потому, что мы кроме С++ видели много более современных и качественных языков, чтоб иметь возможность судить здраво.
C>>Одна из реализаций. Как-там у нее с юникодом, кстати? CC>y wstring USC2 100% поддерживается
Разницу между std::string и std::wstring улавливаете?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, 0xC0000005, Вы писали:
C>>У него было руководство по ООП — книга по паскалю. Занятно, как такой гений (как о нём тут шарписты шаркают) выбрал имено Паскаль 5.5, ведь в нём небыло обьектов, если помните Pascal with Objects был введён с версии 7.0 борландовсой ИДЕ [...]
ГВ>Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для.
Насколько я помню в 6-ке классы появились как адд-он, хотя уже не вспомню точно как было.
C>>>>COM
C>>>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE
C>>Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.
C>Давайте пробежимся по иерархий названий, но ActiveX, DCOM, OLE, DDE — это всё КОМ, и то что мелкомягкие называют новую версию не заставит меня называть одно другим, COM DDE C>CORBA внук DDE, так вас больше устроит? C>И говорив Внук я вовсе не имел ввиду что КОРБу сделали на основе КОМа, боже упаси, а вот по эволюции — КОМ это предшественник КОРБы
Чушь полная.
Немного ликбеза: COM и DDE были созданы с целью коммуникации между процессами в пределах одного компьютера.
CORBA и (много позже) DCOM были созданы для коммуникации между приложениями в сети.
Разницу чувствуете?
А Ваши бурные фантазии на тему кто чей внук/правну/дедушка/папка/мамка лучше оставьте при себе.
Здравствуйте, criosray, Вы писали:
C>Это все замечательно, но Вы выпускаете из виду одну простую истину — производительность важна только там, где ее не хватает. В недавнем обсуждении выяснилось, например, что числомолотилка на дотнет работает быстрее, чем числомолотилка на С++, если компилировать со стандартными настройками. Да, пересобрав ее с SSE3 и всеми возможными оптимизациями получили выигрышь примерно в три раза.
offtopic:
не всеми возможными
векторизация sincos в том примере позволяет на плюсах отыграть еще секунду но это тааакая ересь в коде получается
Здравствуйте, 0xC0000005, Вы писали:
ГВ>>Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для. C>Насколько я помню в 6-ке классы появились как адд-он, хотя уже не вспомню точно как было.
Я точно помню, как было — это был мой первый ОО-язык. Addon-ом, вернее библиотекой, был Turbo Vision (уже — в 6.0). Собственно, я хотел тебе намекнуть на другое: то, что ты говоришь, оно по сути правильно, но небрежность в исторических отсылках даёт лишний повод проигнорировать твои доводы.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
C>>Конечно. Скот Майерс — С++ гуру будет писать не по существу. Куда уж ему до господина с кулхацкерским ником с кывта.
C>Во первых переход на личности не показывает вас с лучшей стороны,
Где Вы увидели личности? C>во вторых я говорил о вашей цитате Майерса, а не о самой его цитате. То что вы впихнули сюда это, вот что не по существу, не поленитесь написать одинм-двумя предложениями в чём проблема С++ поддержки множественного наследования, а не множественного наследования такогого.
Проблема в самой концепции множественного наследования. Множественное наследование, хотя и бывает полезно в некоторых редких случаях, в исключительном большинстве других лишь значительно усложняет дизайн графа классов и создаем тем самым большой потенциал для ошибок дизайна — куда более страшных ошибок, чем большинства других, т.к. рефакторинг и особенно в С++ за неимением нормальных модульных тестов — задача крайне сложная и зачастую просто невыполнимая без тотального переписывания здоровенных участков кода.
C>Поймите, что и С++ и Ява поддверживают множественное наследовние как таковое, только вот используют разные методы обхода ловушек, таких как двоиственность, С++ добавляет виртуальное наследование, Ява разрешает наследовать только от одного не абстрактного класса, а все остальные классы должны быть чисто абстрактными (ака интерфейс).
Вы не путайте наследование (inheritance) с реализацией (implementation). Так вот интерфейсы не наследуются, а реализуются. А наследование и в С# и в Java есть только одинарное.
C>И какой-же геморой вас ждёт, когда интерфейс должен иметь один маленький метод.
Что должен делать интерфейс?
Сморозили очередную глупость. Интерфейс — это просто контракт.
C>Так вот пишите то, о чем вас попросили, а не полёт фантазии на тему "Как это будет красивее"
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, 0xC0000005, Вы писали:
C>>>>>COM
C>>>>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE
C>>>Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.
C>>Давайте пробежимся по иерархий названий, но ActiveX, DCOM, OLE, DDE — это всё КОМ, и то что мелкомягкие называют новую версию не заставит меня называть одно другим, COM DDE C>>CORBA внук DDE, так вас больше устроит? C>>И говорив Внук я вовсе не имел ввиду что КОРБу сделали на основе КОМа, боже упаси, а вот по эволюции — КОМ это предшественник КОРБы C>Чушь полная.
C>Немного ликбеза: COM и DDE были созданы с целью коммуникации между процессами в пределах одного компьютера. C>CORBA и (много позже) DCOM были созданы для коммуникации между приложениями в сети.
C>Разницу чувствуете?
C>А Ваши бурные фантазии на тему кто чей внук/правну/дедушка/папка/мамка лучше оставьте при себе.
И Ком и Корба имплементируют "КОМПОНЕНТНУЮ" модель, и даже idl у них на 99% одинаковый, и всё сводится к общению между компонентами, но КОРБА имеет дополнительные аспекты.
В общем начали с одного, закончили терминами, как обычно и делает crioSray.
Кстати, криоСрэй, какой стаж работы на С++? На примере когда ты сказал что в С++ шаблоне нельзя вызвать неделарированный метод из T, я могу сказать что С++ для тебя это Си с классами(если помнишь), и обсуждать темы такого порядка ты может только на уровне "Мне это не нравится и ВСЁ".
Что за цитаты, примеры кода? Приведи реальный пример когда из-за кривизны языка, а не программера получаются неявные ошибки не описанные и заранее не продуманные в языке.
Всё больше и больше мне здаётся что криоСрэй и есть аффтар той доки, уж очень стиль похож.
Здравствуйте, Mamut, Вы писали:
M>> M>Лучше, если эти пять строк уже встроены в язык
M>> осторожно! Можно ведь и захотеть декодер mpc поиметь встроенный в язык
M>Пусть будет
M>> Ограничивать себя в сладостях надо
M>Зачем?
как зачем? потом устраивают флуд на тему "почему в винде только ИЕ встроен".
Встрой туда кодек mpc тут же начнутся вопли "почему такой, почему не другой, где свобода выбора"
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, 0xC0000005, Вы писали:
ГВ>>>Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для. C>>Насколько я помню в 6-ке классы появились как адд-он, хотя уже не вспомню точно как было.
ГВ>Я точно помню, как было — это был мой первый ОО-язык. Addon-ом, вернее библиотекой, был Turbo Vision (уже — в 6.0). Собственно, я хотел тебе намекнуть на другое: то, что ты говоришь, оно по сути правильно, но небрежность в исторических отсылках даёт лишний повод проигнорировать твои доводы.
Ок, полагаю я ошибся насчёт того, что автор неправильно выбрал версию паскаля для изучения ОО.