Другие языки программирования и технологии

Нужна помощь по правильному пониманию ООП

Сижу часа полтора, пытаюсь понять эти 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".
юе
юрий ерёменко
36 282
Лучший ответ
Вячеслав Богданов Ребёнок, который учится писать по-русски, просит объяснить, что значит слово кампютер, а вы в первую очередь указываете на ошибки в написании, так и не объяснив, что же это такое.
Вячеслав Богданов Спасибо, понял
Предположим у нас есть класс Зверь ("животное" - слишком обще, так что только млекопитающие). Этот класс имеет виртуальный метод Удовольствие, воспроизводящий проявление эмоций зверя.

Наследуем от класса Зверь классы Кошка и Собака. В каждом из этих классов определяем свой метод Удовольствие.

Определим функцию, принимающую в качестве параметра объект класса Зверь и вызывающую его метод Удовольствие. Если мы передадим в эту функцию объект класса Кошка, зверь задерёт хвост трубой и будет мурлыкать, а если объект класса Собака - махать хвостом и лаять.

Это и есть полиморфизм через наследование (не "разные значения", а "разный код").

Тот же самый эффект может быть получен вообще без наследования - через интерфейсы.
Артем Гусейнов
Артем Гусейнов
61 194
Вячеслав Богданов Спасибо, понял
Проще на практическом объяснить
Наверное, уже знаешь, что существует куча разных видов баз данных, и они отличаются друг от друга по виду запросов. Для удобства для всех поддерживаемых баз данных можно создать один интерфейс (у всех будут одинаковые названия методов и свойств, которыми потом можно будет пользоваться), а вот наполнение некоторых методов будет различаться
** *юр4Ик* **
** *юр4Ик* **
94 175
Вячеслав Богданов В принципе, тоже самое, что и цвет шерсти и размер лап у кота и собаки)) Относительно понял, что вы написали. Создали один интерфейс для нескольких баз данных, в котором одинаковы названия классов, тот же 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();
}
Альберт Хайруллин тут вы подставляетесь )))
от чего логично наследовать квадрат? от прямоугольника или наоборот?