Сижу часа полтора, пытаюсь понять эти 4 принципа. Если неправильно думаю, поправьте
Наследование - класс Корова унаследовал функционал, данные от класса Животное, изменив реализацию метода func
class Animal {
Public static String func(){
System.out.println("Это класс животное");
}
public static String eat () {
System.out.println("Все животные едят") ;
}
}
class Cow extends Animal {
public static String func (){
System.out.println("Это класс корова");
}
}
Инкапсуляция - защита от изменения данных метода за пределами класса, в котором вызывается данный метод
class Animal {
private static String AnimalName (String name) {
name = "Рекс";
}
}
class Dog extends Animal {
public static String AnimalName (String name){
name = "Пушок"; // переменная name не изменится, потому что инкапсуляция защищает её от изменения за пределами своего класса
}
}
Абстракция - человек и кот имеют глаза, уши и нос. Это мы запишем в класс. Однако человек, в отличие от кота, не имеет хвоста, поэтому записывать эту характеристику мы не будем, чтобы не нагружать класс
class Character {
String eyes, ears, nose;
String tail; // записывать не будем
}
Полиморфизм - класс Кот и Собака имеют одинаковый интерфейс (цвет шерсти, размер лап), но разные значения
class Character {
String color, paw height;
}
class Cat extends Character {
String color = "grey", paw height = "10cm";
}
class Dog extends Character {
String color = "brown"; paw height = "15cm";
}
Не до конца понимаю полиморфизм, как-то это туманно, объясните на языке, похожем на тот, что написал выше
Другие языки программирования и технологии
Нужна помощь по правильному пониманию ООП
Тут все методы статические. Статический метод - это по сути обычная функция. Чтоб полиморфизм работал в полную силу, должны использоваться виртуальные методы.
Часть функций содержит бессмысленный код и неправильный комментарий.
Переменная изменяется, но только внутри функции. Снаружи функции эти изменения не видны. Это не связано с ООП и инкапсуляцией.
public static String AnimalName (String name) {
name = "Пушок";
}
У тебя кошки от собак отличаются только значениями полей. Для этого нет смысла создавать отдельные классы. Класс - это тип данных. Объект - это значение такого типа (экземпляр класса). Каждый объект может содержать разные данные.
В дочернем классе нет смысла повторно объявлять поля базового класса, они там уже есть. У тебя получается, что в классе Dog два поля "color".
Часть функций содержит бессмысленный код и неправильный комментарий.
Переменная изменяется, но только внутри функции. Снаружи функции эти изменения не видны. Это не связано с ООП и инкапсуляцией.
public static String AnimalName (String name) {
name = "Пушок";
}
У тебя кошки от собак отличаются только значениями полей. Для этого нет смысла создавать отдельные классы. Класс - это тип данных. Объект - это значение такого типа (экземпляр класса). Каждый объект может содержать разные данные.
В дочернем классе нет смысла повторно объявлять поля базового класса, они там уже есть. У тебя получается, что в классе Dog два поля "color".
Вячеслав Богданов
Ребёнок, который учится писать по-русски, просит объяснить, что значит слово кампютер, а вы в первую очередь указываете на ошибки в написании, так и не объяснив, что же это такое.
Вячеслав Богданов
Спасибо, понял
Предположим у нас есть класс Зверь ("животное" - слишком обще, так что только млекопитающие). Этот класс имеет виртуальный метод Удовольствие, воспроизводящий проявление эмоций зверя.
Наследуем от класса Зверь классы Кошка и Собака. В каждом из этих классов определяем свой метод Удовольствие.
Определим функцию, принимающую в качестве параметра объект класса Зверь и вызывающую его метод Удовольствие. Если мы передадим в эту функцию объект класса Кошка, зверь задерёт хвост трубой и будет мурлыкать, а если объект класса Собака - махать хвостом и лаять.
Это и есть полиморфизм через наследование (не "разные значения", а "разный код").
Тот же самый эффект может быть получен вообще без наследования - через интерфейсы.
Наследуем от класса Зверь классы Кошка и Собака. В каждом из этих классов определяем свой метод Удовольствие.
Определим функцию, принимающую в качестве параметра объект класса Зверь и вызывающую его метод Удовольствие. Если мы передадим в эту функцию объект класса Кошка, зверь задерёт хвост трубой и будет мурлыкать, а если объект класса Собака - махать хвостом и лаять.
Это и есть полиморфизм через наследование (не "разные значения", а "разный код").
Тот же самый эффект может быть получен вообще без наследования - через интерфейсы.
Вячеслав Богданов
Спасибо, понял
Проще на практическом объяснить
Наверное, уже знаешь, что существует куча разных видов баз данных, и они отличаются друг от друга по виду запросов. Для удобства для всех поддерживаемых баз данных можно создать один интерфейс (у всех будут одинаковые названия методов и свойств, которыми потом можно будет пользоваться), а вот наполнение некоторых методов будет различаться
Наверное, уже знаешь, что существует куча разных видов баз данных, и они отличаются друг от друга по виду запросов. Для удобства для всех поддерживаемых баз данных можно создать один интерфейс (у всех будут одинаковые названия методов и свойств, которыми потом можно будет пользоваться), а вот наполнение некоторых методов будет различаться
Вячеслав Богданов
В принципе, тоже самое, что и цвет шерсти и размер лап у кота и собаки)) Относительно понял, что вы написали. Создали один интерфейс для нескольких баз данных, в котором одинаковы названия классов, тот же class Animal{ String color, paw height; }, но разные внутренности у наследственных классов (color = "red"; height = "10cm";). Ну, не самый, конечно, лучший пример для объяснения 14-ти летнему школьнику, но понять можно
ООП нужно осваивать на других примерах. Эти животные, автомобили, юниты в играх - слишком отвлекают.
Наиболее понятно и полезно в применение будет изучить 2Д фигуры.
Есть различные фигуры - круг, квадрад, прямоугольник, треугольник и т. д.
Все эти фигуры это отдельные классы.
Их объединяет, очевидно то, что они все ФИГУРЫ.
Значит должен быть общий класс который описывает общие параметры, даёт общие методы.
Например, у всех фигур есть параметры площади и периметра. Соответственно, в общем классе можно разместить эти переменные и доступ к ним - инкапсуляция (всего навсего размещение информации (переменных) внутри класса).
Фигуры будут иметь к ним доступ - это есть наследование.
А полиморфизм даёт доступ к различным классам по их общему предку.
int get_S( Shape * shape ){
return shape->getS();
}
int main(){
Rectangle R; //Классы Circle и Rectangle потомки Shape
Circle C;
get_S(R); // И их можно передать в качестве аргумента
get_S(C);
}
Можно из общего класса получить конкретный объект дочернего класса (если знаешь что это действительно он).
int get_S( Shape * shape ){
if( shape->isCircle() ){
Circle * c = (Circle *)shape;
...
}else if( shape->isRectangle() ){
Rectangle * r = (Rectangle *)shape;
...
}
return shape->getS();
}
Наиболее понятно и полезно в применение будет изучить 2Д фигуры.
Есть различные фигуры - круг, квадрад, прямоугольник, треугольник и т. д.
Все эти фигуры это отдельные классы.
Их объединяет, очевидно то, что они все ФИГУРЫ.
Значит должен быть общий класс который описывает общие параметры, даёт общие методы.
Например, у всех фигур есть параметры площади и периметра. Соответственно, в общем классе можно разместить эти переменные и доступ к ним - инкапсуляция (всего навсего размещение информации (переменных) внутри класса).
Фигуры будут иметь к ним доступ - это есть наследование.
А полиморфизм даёт доступ к различным классам по их общему предку.
int get_S( Shape * shape ){
return shape->getS();
}
int main(){
Rectangle R; //Классы Circle и Rectangle потомки Shape
Circle C;
get_S(R); // И их можно передать в качестве аргумента
get_S(C);
}
Можно из общего класса получить конкретный объект дочернего класса (если знаешь что это действительно он).
int get_S( Shape * shape ){
if( shape->isCircle() ){
Circle * c = (Circle *)shape;
...
}else if( shape->isRectangle() ){
Rectangle * r = (Rectangle *)shape;
...
}
return shape->getS();
}
Альберт Хайруллин
тут вы подставляетесь )))
от чего логично наследовать квадрат? от прямоугольника или наоборот?
от чего логично наследовать квадрат? от прямоугольника или наоборот?
Похожие вопросы
- Нужна помощь! Я правильна настроила интернет-маршрутиризатор, но вот подключиться к нему с ноутбука не могу.
- Нужна помощь в понимание выражения return в Си на данном примере
- Нужна помощь по информатике.
- Нужна помощь с паскалем!
- Программисты,нужна помощь,пожалуйста Для вас легко
- Логика. Нужна помощь.
- Нужна помощь
- Информатика!Нужна помощь!если можно,с объяснением.
- Пожалуйста, очень нужна помощь с Pascal
- Люди! Нужна помощь. Помогите настроить Оперу