2012-02-26 1 views
0

Первый вопрос здесь, я искал вокруг, и я боюсь, что не знаю точной терминологии для того, что я пытаюсь сделать, t атаковать меня, если его уже спросили. Направьте меня в правильном направлении, и я буду читать.Задача-C, Неправильное наследование ivars подклассам и методам

У меня есть Класс:
"Форма" (Из NSObject)
Подклассов "Shape" включает в себя:
"круг" и т.д. - каждое с их соответствующим Calcarea (рассчитать площадь) методу.

Мои подклассы отлично работают в качестве лиц, получить класс «Круг», чтобы установить Ивар (с помощью «Shape» методы в «Shape» и наследовать их, а затем вычислить область, используя те

Что я хочу сделать:. Я хочу иметь возможность устанавливать параметры для объекта «Shape». Затем я хочу, чтобы эти параметры просачивались в каждый из подклассов («Круг», «Треугольник» и т. Д.), Чтобы я мог ввести два параметра, и это дает мне вся моя площадь и окружность вычисление из каждого подкласса. каждый из методов подкласса тот же «Calcarea», например.


Теории:
-Brute, заставляя мой путь через использование двух переменных в моем основном методе для сброса каждого параметра для каждого подкласса. это кажется действительно неэффективным, но работает.

-using «id», в основном, этот объект создает параметры в «Shape» через каждый подкласс, а затем перебирает каждый подкласс до тех пор, пока все не будут закончены. Пробовал пару вещей, не могу понять.

-создание объекта в «Shape», которое затем выполняет каждую из функций его подклассов - это звучит плохо из того, что я читал, суперклассы не должны знать о том, что делают их подклассы ... могу ли я создать метод в «Shape», который выполняет [myCircle calcArea] и [myTriangle calcArea]?

-Я проектирую эту программу неправильно.


Заранее благодарим за вашу помощь!

ответ

1

Если я правильно вас понял. В подклассах ООП наследуются все атрибуты их суперклассов. Поэтому, когда у вас есть:

@interface Shape : NSObject { 
    int _mParam; 
} 
-(int) calcArea; 
@end 

Вы можете получить доступ к _mParam в своих подклассах. Затем создайте подкласс:

@interface Circle : Shape { 
} 
-(id) init:(int) param; 
-(int) calcArea; 
@end 

-(id) init:(int) param { 
    .... 
    _mParam = param; 
    .... 
} 

-(int) calcArea { 
    //some calculations here 
    return M_PI*r*r + _mParam; 
} 
+0

поэтому, если я правильно понимаю вас, я могу создать метод в SuperClass, а затем определить и инициировать его в суперклассах. - Это имеет смысл для меня, но как работает идентификатор в этом случае? Кажется, что инициирует класс с параметром «param», поскольку переменная правильная? Как это должно быть закодировано в основной функции? – thattookawhile

+0

id - указатель на внутреннюю структуру объекта. Вы вообще не должны беспокоиться об идентификаторе - он используется внутри системы времени выполнения. – Max

+0

какая основная функция? – Max