Давайте рассмотрим ваш пример класса Dog и Cat, и давайте проиллюстрируем использование C #:
И собака, и кошка - животные, в частности четвероногие млекопитающие (животные слишком общие). Предположим, что у вас есть абстрактный класс Mammal, для обоих из них:
public abstract class Mammal
Этот базовый класс, вероятно, будет иметь методы по умолчанию, такие как:
Все это поведение, которое имеет более или менее ту же реализацию между любыми видами. Чтобы определить это, вы будете иметь:
public class Dog : Mammal
public class Cat : Mammal
Теперь предположим, что есть другие млекопитающие, которые мы обычно увидим в зоопарке:
public class Giraffe : Mammal
public class Rhinoceros : Mammal
public class Hippopotamus : Mammal
Это будет по-прежнему действительным, потому что в основе функциональности Feed()
и Mate()
все равно будут одинаковыми.
Однако, жирафы, носороги и бегемоты - это не совсем животные, из которых вы можете сделать домашних животных. Вот где будет полезен интерфейс:
public interface IPettable
{
IList<Trick> Tricks{get; set;}
void Bathe();
void Train(Trick t);
}
Реализация вышеуказанного контракта не будет одинаковой между кошкой и собакой; их реализация в абстрактном классе для наследования будет плохой идеей.
Теперь ваши определения Dog и Cat должны выглядеть так:
public class Dog : Mammal, IPettable
public class Cat : Mammal, IPettable
Теоретически вы можете переопределить их из более высокого базового класса, но по существу интерфейс позволяет вам добавлять только те вещи вам нужно в класс без необходимости наследования.
Следовательно, поскольку вы обычно можете наследовать только один абстрактный класс (в большинстве статически типизированных языков OO, которые являются ... исключениями включают C ++), но могут реализовать несколько интерфейсов, он позволяет строить объекты строго по мере необходимости .
Вы, вероятно, для начала захотите просто запустить его внутри виртуальной машины. Это PITA, пытающаяся разработать ОС на реальном оборудовании (с постоянной перезагрузкой и отладкой по последовательному кабелю).
Внутри виртуальной машины у вас обычно есть упрощенный (и относительно стандартизованный) набор оборудования для поддержки, который также может облегчить начальную разработку. В частности, если вы хотите показать кому-то свою ОС, просто дайте ему файл .vhd и будьте достаточно уверены, что если он работает для вас, то он будет работать и для них.
Вы также можете захотеть начать с чего-то, что уже изначально работает (например, Microsoft Singularity довольно изящно). Это позволит вам избавиться от утомительного загрузчика и базовых драйверов устройств, и вы сможете быстрее приступить к "содержательным" вещам.
Лучше взглянуть на исходный код Linux 0.01 . это первая версия ОС. это очень просто и информативно. Это хорошее место для начала
Начните с загрузчика, узнайте о получении карты памяти, сканировании шины PCI, инициализации различных микросхем, таких как APIC, и о том, как перейти в защищенный режим.
В начале загрузки ядра попробуйте написать подпрограммы, которые будут выводить на экран, читать с клавиатуры, запустить простой отладчик, затем диспетчер физической памяти, а затем диспетчер виртуальной памяти. Последние два нельзя откладывать надолго, потому что каждой программе, включая операционную систему, нужен способ упорядоченного распределения и освобождения памяти.
Я бы рекомендовал сначала изучить небольшую ОС, такую как Minix1, которая была создана для образовательных целей или Minix3, которая совместима с POSIX.
Вам понадобится эта книга:
alt text http://ecx.images-amazon.com/images/I/5169V5J687L._SL500_AA300_.jpg
Вам придется реализовать несколько видов дескрипторных таблиц, чтобы включить 32-битный режим. Включение многопоточности - задача не из легких и почти наверняка будет обязательным условием. Вы, вероятно, также захотите разработать поддержку файловой системы на раннем этапе, чтобы уйти от образа дискеты или чего-либо, что вы сейчас используете.
Я уверен, что вы уже сталкивались с этим сайтом http://wiki.osdev.org/Main_Page , но на нем есть много замечательных статей.
Вы также можете найти эту книгу полезной для той стадии развития, на которой вы находитесь: The Indispensable PC Hardware Book, в ней очень подробно описаны детали, есть много диаграмм, а также фрагменты кода.