Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запутался с наследованием и полиморфизмом 
:(
    Опции темы
Нитонисе
Дата 3.11.2010, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  3.11.2010,  19:47 Найти цитируемый пост)
Ох, не ту вы задачу выбрали для первого проекта

Ну на простом проекте ООП впринципе не нужен)

Цитата(xvr @  3.11.2010,  19:47 Найти цитируемый пост)
В вашем случае функции расчета нагрузки не должны быть членами класса 'Балка'. Равно как и членами класса 'Нагрузка'. Это должны быть вообще отдельные сущности, выбираемые по сочетанию динамических типов 'Балка/Нагрузка'

То есть функция принимает в качестве аргументов объект нагрузки, объект балки и возвращает некий результат? Ну это как вариант... врядли тут могут быть единственно правильные решения. Или вы попробуете обосновать почему именно ваш вариант наиболее предпочтителен?

Цитата(xvr @  3.11.2010,  19:47 Найти цитируемый пост)
Вы уж определитесь, что у вас 'есть'

Я привел другую ситуацию. Это уже не о расчете балок. Классы от А до D вложены один в один как матрешки. А есть класс Е, которому нередко нужны данные из каждого из этих матрешек. Мне кажется с таким подходом будут слишком велики накладные расходы по вызову функций возвращающих объект с более низкого уровня (начиная от D и до А).
PM MAIL   Вверх
mes
Дата 3.11.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  3.11.2010,  18:59 Найти цитируемый пост)
Ну на простом проекте ООП впринципе не нужен)

да и на сложном проекте.. не всегда нужно "сырой" ООП пихать всюду...

под "сырым ООП" я подразумеваю попытка реализовать ООП средствами языка, нежели проектированием..
понятнее описать не могу.. это надо почувствовать.. вобщем не всегда стоит решать задачу в лоб..

Добавлено через 6 минут и 37 секунд
исходя истого что написали:
1. задача по расчету нагрузки на балку вместо двух имеет три компонента,
а именно: балка, нагрузка, и площадь соприкосновения

2. наследование от балки, мягко скатать, неэстетичное и стоит отказаться в пользу агрегации

3. функции расчета нагрузки, как уже сказали выше, не относятся к балке...

итого в той  части задачи, которую Вы описали,  полиморфизм притянут за уши,  и никакой выгоды вы от него не получите..

Добавлено через 9 минут и 16 секунд
Цитата(Нитонисе @  3.11.2010,  18:59 Найти цитируемый пост)
. Или вы попробуете обосновать почему именно ваш вариант наиболее предпочтителен?

потому, что балка вместе с нагрузкой не обладает достаточными знаниями для решения этого вопроса..

Добавлено через 10 минут и 53 секунды
и вобще старайтесь не втягивать зависимости внутрь классов.. чем меньше тем легче поддерживать и развивать проект.. 
smile


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 3.11.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
да и на сложном проекте.. не всегда нужно "сырой" ООП пихать всюду...под "сырым ООП" я подразумеваю попытка реализовать ООП средствами языка, нежели проектированием..понятнее описать не могу.. это надо почувствовать.. вобщем не всегда стоит решать задачу в лоб..

Так ООП более предпочтительно структурного программирования. Во всяком случае область применения ООП выше. Мой нынешний проект вполне годится для опробирования ООП. Есть действующий аналог со структурным походом, хочу переписать его в объектный.

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
а именно: балка, нагрузка, и площадь соприкосновения

И что должно быть в площади соприкосновения?

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
 наследование от балки, мягко скатать, неэстетичное и стоит отказаться в пользу агрегации

В чем будет агрегация? Есть балка, у балки могут быть три типа опор с каждой стороны. Можно типы опор впринципе прописать как свойства балки... но чем это лучше?

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
3. функции расчета нагрузки, как уже сказали выше, не относятся к балке...

Что ж это тогда будет - просто свободная функция?


Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
итого в той  части задачи, которую Вы описали,  полиморфизм притянут за уши,  и никакой выгоды вы от него не получите..

Не спорю, что он тут реализован неэффективно, но надо хоть почувствовать на своих родных объектах как он работает и в каких случаях какие функции вызываются))

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
потому, что балка вместе с нагрузкой не обладает достаточными знаниями для решения этого вопроса..

Как же не обладает? Обладает. Достаточно данных нагрузки и балки чтобы определить внутренние усилия.

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
и вобще старайтесь не втягивать зависимости внутрь классов.. чем меньше тем легче поддерживать и развивать проект.. 

То есть? Стараться не передавать методам объекта в качестве аргументов других объектов и не содержать в качестве данных класса ссылки и указатели на др. объекты?
PM MAIL   Вверх
mes
Дата 3.11.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Так ООП более предпочтительно структурного программирования. 

ООП бывает разное.. ООП - как подерживаемая компилятором парадигма.. ее надо принять там где нужно.. и не злоупотрблять.. и ООП (точнее ООА объектно ориентированный анализ) как способ группировки знаний - тут стоит уделить побольше внимания..

Добавлено через 1 минуту и 7 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
. Мой нынешний проект вполне годится для опробирования ООП.

Я Вас не отгавариваю от ООП, а говорю что не все ее достижения стоит запихивать в одну корзину.. кстати этим вы убиваете ООП как подход...

Добавлено через 2 минуты и 14 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Есть действующий аналог со структурным походом, хочу переписать его в объектный.

наличие кучи наследований не достаточно для установления объктного подхода..

Добавлено через 3 минуты и 42 секунды
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
И что должно быть в площади соприкосновения?

если балка двухмерная, то длина соприкосновения.. т.е отрезок балки на который воздействуют.. 
достаточно малый отрезок есть точка..

Добавлено через 5 минут и 19 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
В чем будет агрегация? Есть балка, у балки могут быть три типа опор с каждой стороны. Можно типы опор впринципе прописать как свойства балки... но чем это лучше?

ну так смотрите что написали жирным, так и записывайте в программный код, и не нагружайте логику ни себе, ни другим..

Добавлено через 6 минут и 45 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Что ж это тогда будет - просто свободная функция?

если не зависит от какого то мира знаний, то просто свободная функция..  и не бойтесь что это ведет удаляет от ООП, наоборот Вы начинаете использовать его силу..

Добавлено через 8 минут и 17 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Не спорю, что он тут реализован неэффективно, но надо хоть почувствовать на своих родных объектах как он работает и в каких случаях какие функции вызываются))

неэффективно, это лишь малая доля проблемы.. намного большая проблема - не логично..

Добавлено через 9 минут и 30 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Как же не обладает? Обладает. Достаточно данных нагрузки и балки чтобы определить внутренние усилия.

Это в вашем ограниченом варианте достаточно.. а если подумать далеко не так все одназначно..
или весы и на земле и на луне  показывают одно и то же ?

Добавлено через 10 минут и 59 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
То есть? Стараться не передавать методам объекта в качестве аргументов других объектов и не содержать в качестве данных класса ссылки и указатели на др. объекты? 

нет.. стараться не вносить детали и знания, которые объекту не необходимы.. 




--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  3.11.2010,  22:52 Найти цитируемый пост)
если балка двухмерная, то длина соприкосновения.. т.е отрезок балки на который воздействуют.. достаточно малый отрезок есть точка..

И зачем такие сложности? Почему нельзя вычислять усилия в объекте Балка с аргументом Нагрузка?
Цитата(mes @  3.11.2010,  22:52 Найти цитируемый пост)
ну так смотрите что написали жирным, так и записывайте в программный код, и не нагружайте логику ни себе, ни другим.

Это значит такой код?
Код

class Балка
{
  protected:
    ТипОпоры леваяОпора;
    ТипОпоры праваяОпора;
};

Цитата(mes @  3.11.2010,  22:52 Найти цитируемый пост)
если не зависит от какого то мира знаний, то просто свободная функция..  и не бойтесь что это ведет удаляет от ООП, наоборот Вы начинаете использовать его силу..

С таким подходом отдельными функциями можно реализовать практически ВСЁ. Будет одна программа, вызывающая другие подпрограммы, которые вызывает более мелкие подпрограммы. Это не ООП, а структурный подход.
PM MAIL   Вверх
mes
Дата 4.11.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  09:21 Найти цитируемый пост)
С таким подходом отдельными функциями можно реализовать практически ВСЁ. Будет одна программа, вызывающая другие подпрограммы, которые вызывает более мелкие подпрограммы. 

хм.. т.е. из крайности в крайность ?

Цитата
Это не ООП, а структурный подход. 

а ООП и есть структурный подход  smile

Добавлено через 6 минут и 37 секунд
Цитата(Нитонисе @  4.11.2010,  09:21 Найти цитируемый пост)
Почему нельзя вычислять усилия в объекте Балка с аргументом Нагрузка?

потому что реализацию расчета нагрузок для всех видов объектов удобно поместить в одно место, в независимости от классов самих объектов..

А вот стоит ли группировать расчет нагрузок в класс или нет - зависит от реализации..



--------------------
PM MAIL WWW   Вверх
xvr
Дата 4.11.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Один из принципов ООП (в С++) - инкапсуляция. Это в частности означает, что все операции класса (т.е. операции, использующие и влияющие на состояние класса) должны быть описаны ВНУТРИ класса. Возьмем операцию 'Расчет нагрузки на балку'. Она ни может быть описана ОДНИМ классом (ни Балкой ни Нагрузкой). Она полностью (в том числе и алгоритмически) зависит от обоих этих классов. А это означает, что в рамках ООП в С++ она НЕ МОЖЕТ быть членом ни одного из этих классов.
А это в свою очередь означает, что НЕ НАДО притягивать сюда за уши ООП механизмы С++, нужно строить НОВЫЙ механизм, используя возможности С++

Цитата(Нитонисе @  3.11.2010,  22:35 Найти цитируемый пост)
Что ж это тогда будет - просто свободная функция?
Вы смотрели ссылки, что я давал? Там расписано (в том числе с примерами на С++) как это делать.
Еще поищите в сети 'Паттерны программирования' (как то так называется). Должна быть информация и на русском.

И еще совет - прежде чем углубляться в дебри паттернов и пр. изучите как следует обычное ООП (в рамках С++). Иначе вы не углубитесь, а утоните  smile 

Цитата(Нитонисе @  3.11.2010,  19:59 Найти цитируемый пост)
Классы от А до D вложены один в один как матрешки. А есть класс Е, которому нередко нужны данные из каждого из этих матрешек. Мне кажется с таким подходом будут слишком велики накладные расходы по вызову функций возвращающих объект с более низкого уровня (начиная от D и до А). 
Вот, замечательный пример на непонимание основ (или на неумение сформулировать задачу)  smile 

Код

class A {
..

void fa();
};

class B : public A {
...

void fb();
};

class C : public B {
...

void fc();
};

class D : public C {
...
void fd();
};


D d;

d.fa();
d.fb();
d.fc();
d.fd();


PM MAIL   Вверх
Нитонисе
Дата 4.11.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  4.11.2010,  11:48 Найти цитируемый пост)
Возьмем операцию 'Расчет нагрузки на балку'. Она ни может быть описана ОДНИМ классом (ни Балкой ни Нагрузкой). Она полностью (в том числе и алгоритмически) зависит от обоих этих классов. А это означает, что в рамках ООП в С++ она НЕ МОЖЕТ быть членом ни одного из этих классов.

И что ж тогда? Объявить нагрузку атрибутом класса балка? Тогда классу всего хватит, чтобы вычислить усилия в балке от нагрузки. 
Мне представляется ООП - это куча различных объектов каким-то образом взаимодействующих друг с другом. Причем взаимодействие должно быть обязательно, иначе система попросту не будет работать. Это все равно что поставить в кузов от машины мотор, но не соединить его с ведущей осью - машина никуда не уедет.
В контексте моего проекта есть объект нагрузка и есть объект балка. Одно не являются частью другого, они могут существовать независимо друг от друга. При этом нужно уметь посчитать усилия в балке от этой нагрузки. Усилия ведь без нагрузки быть не могут. Значит все слепить в один класс? Но тогда придется все объединять и объединять до тех пор, пока не получится куча различных параметров, характеризующих систему и к этой куче обращается куча подпрограмм, оперирующих ими. Это не ООП, а структурный (алгоритмический подход).

Добавлено через 1 минуту и 31 секунду
Цитата(xvr @  4.11.2010,  11:48 Найти цитируемый пост)
Вот, замечательный пример на непонимание основ (или на неумение сформулировать задачу)

Перейдем к более конкретным абстракциям. Есть спица, спица часть обода, обод часть колеса, колесо часть шасси. Предлагаете все эти объекты объявить наследниками друг друга?
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
И что ж тогда? Объявить нагрузку атрибутом класса балка? 

вам уже говорили, ничего лишнего, что не отражает действительно состояние балки.. 
smile

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
Мне представляется ООП - это куча различных объектов каким-то образом взаимодействующих друг с другом. 

не совсем правильное представление.. этого не достаточно чтоб называться ООП..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
 Причем взаимодействие должно быть обязательно,

а не думаете ли Вы что взаимодействие это отдельная сущность ? а вот что это класс или функция , надо смотреть по требованиям..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
Это все равно что поставить в кузов от машины мотор, но не соединить его с ведущей осью

обратите что на соединение идут другие детали/механизмы, а не все пихается в двигатель или в ось..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
Значит все слепить в один класс

Вам как раз обратное советуют..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
 Это не ООП, а структурный (алгоритмический подход).

то что Вы описали не структурный подход, а куча хлама..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
 Есть спица, спица часть обода, обод часть колеса, колесо часть шасси. Предлагаете все эти объекты объявить наследниками друг друга?

ни за что smile
кстати покажите цитату после которой Вы сделали такие далеко идущие планы..

Это сообщение отредактировал(а) mes - 4.11.2010, 14:11


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  14:04 Найти цитируемый пост)
вам уже говорили, ничего лишнего, что не отражает действительно состояние балки.. 

В контексте моей задачи состояние балки характеризуется только длиной пролета и типами опор.
Состояние нагрузки характеризуется ее величиной и положением на некоей абстрактной балке.
Мне нужно определить внутренние усилия в балке от нагрузки. Каким образом это делать? Помним о том, что другие объекты могут спросить у балки - "А какие у тебя внутренние усилия от этой нагрузки?".
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  13:11 Найти цитируемый пост)
В контексте моей задачи состояние балки характеризуется только длиной пролета и типами опор.
Состояние нагрузки характеризуется ее величиной и положением на некоей абстрактной балке.
Мне нужно определить внутренние усилия в балке от нагрузки. Каким образом это делать? Помним о том, что другие объекты могут спросить у балки - "А какие у тебя внутренние усилия от этой нагрузки?". 

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

и так у нас есть основные сущности
Код

struct beam    {};        
struct support {};
struct load    {};
struct stress  {};


теперь нам нужно построить из них конструкцию
в котором можете размещать балку, опоры, и нагрузку ( делать это в зависимости от разнообразия конструкций, можно как динамически, так и статически) и у нее же опрашивать усилие..

вот условный набросок :
Код

struct simple_construction 
{
     beam Beam;
     support Support[2];
     load Load;
   
     bool is_valid () ;
     stress calc_stress ();
};


Это сообщение отредактировал(а) mes - 4.11.2010, 14:48


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  14:16 Найти цитируемый пост)
теперь нам нужно построить из них конструкциюв котором можете размещать балку, опоры, и нагрузку ( делать это в зависимости от разнообразия конструкций, можно как динамически, так и статически) и у нее же опрашивать усилие..

То есть надо создавать объект класса БалкаПодНагрузкой, атрибутами которой будут один экземпляр Балки и вектор экземпляров Нагрузка?
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  13:30 Найти цитируемый пост)
То есть надо создавать объект класса БалкаПодНагрузкой, атрибутами которой будут один экземпляр Балки и вектор экземпляров Нагрузка? 

не совсем так.. там ниже приведен пример.. 



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  14:32 Найти цитируемый пост)
не совсем так.. там ниже приведен пример.. 

Где хранить результат расчета? Нагрузок может быть много.

Почему вы все объявляете структурами?
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  13:38 Найти цитируемый пост)
Почему вы все объявляете структурами? 

просто удобно... чтоб явно показать тип.. 
или почему структ вместо класса ? 
во первых чтоб не писать лишние паблики, во вторых, модель типа сейчас больше соответсвует именно структуре..

Добавлено через 1 минуту и 35 секунд
Цитата(Нитонисе @  4.11.2010,  13:38 Найти цитируемый пост)
Где хранить результат расчета? Нагрузок может быть много.

сделайте конструкцию в которую можно добавить не одну нагрузку..

если я правильно понял ваш вопрос.. 




--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.