пятница, 2 марта 2007 г.

У C# нет друзей!

Каково было мое удивление обнаружить у C# не предусмотрено такого хорошего ключевого слова как friend. Конечно многие скажут, что вроде и ни к чему оно вовсе, и что хороший дизайн можно сделать без него. Похоже вцелом на историю про goto. Еще народ советует, мол используй новое слово internal - тогда все будет почти как и с френдом.

А как быть если я хочу сделать конструктор класса с private? Зачем это нужно. Сейчас объясню.

Пусть есть некоторый AbstractClass, от которого наследуются ConcreteClass1 и ConcreteClass2. Пусть еще имеется некоторый класс WorkClass, который агрегирует список конкретных классов в массиве, элемент которого суть указатель на AbstractClass. Таким образом WorkClass не различает конкретных классов и ничего не знает об их особенностях. Ибо это есть очень хорошо и называется сокрытие информации. Для такой штуки понадобится еще класс ClassFactory, который будет создавать конкретные классы с помощью функции-члена

//---------------------------------------
AbstractClass * CreateClass(int Index);
//---------------------------------------

где Index означает какой конкретный класс создавать (первый или второй).

На С++ все просто. Конструкторы в ConcreteClass1 и ConcreteClass2 объявляем private. Вызвать их ниоткуда нельзя. Делаем с помощью слова friend так, чтобы эти конструкторы можно было вызывать только из ClassFactory. Наслаждаемся.
По-другому создать конкреные классы нельзя!

А на C#? Сделать такую штуку без ключевого слова friend тяжело. Но можно.
Посмотрим как...


class ClassFactory
{
public ClassFactory()
{

}

public class ConcreteClass1 : AbstractClass
{
internal ConcreteClass1()
: base()
{

}
}
private class ConcreteClass2 : AbstractClass
{
internal ConcreteClass2()
: base()
{

}
}
}


А в WorkClass имеем
ClassFactory Factory = new ClassFactory();

AbstractClass Class1 = Factory.CreateClass(1);//нормально
AbstractClass Class2 = Factory.CreateClass(2);//нормально
AbstractClass Class3 = new ConcreteClass1();//не проходит!!!!!!

Ура! Резалт готов. Единственное что расстраивает - описание конкретных классов внутри ClassFactory, что раздувает этот класс до больших размеров, особенно если конкретных классов больше двух.

четверг, 1 марта 2007 г.

как лечить винт

Не далее как 2 дня назад мой брат купил себе дополнительный винт. Но он в этом деле неособо. Поэтому при подключении он что-то там сделал не так (вроде два винта посадил мастерами) и короче старый винт перестал грузится, даже при отключении нового. Вобщем привет. Partition Magic показал что место на старом винте теперь считается не размеченным (там было два раздела NTFS). Короче говоря все плохо было, поскольку брат мечтал не только забрать инфу оттуда, но и восстановить систему в первозданном виде.

Помогла програмка Acronis Recovery Expert. Восстановила оба раздела. Единственный минус - система так и не стала грузиться. Бут-сектор видимо погиб безвозвратно, но диск стал видиться и восстановление бут-сектора стало делом техники.

Так что всем рекомендую. Очень полезная софтина.

Привет!