Наследование и конструктор

Рейтинг: 2Ответов: 1Опубликовано: 26.04.2015

Здравствуйте, есть задача:

  1. Создать класс "одномерный вектор размерности 4"

  2. Создать соответствующие методы:

    • задания элементов матрицы;
    • вывода матрицы на экран;
    • нахождения максимального элемента матрицы;
  3. Описать производный от него класс матрица 4 X 4 с соответствующими перегруженными методами. Создать объекты классов "матрица" и "одномерный вектор".

  4. Найти максимальные элементы каждого объекта.

Одно из главных условий: должен быть конструктор. Я реализовал в конструкторе ввод массива, но теперь столкнулся с проблемой при наследовании конструктора, в классе наследника.

Вот код:

using System;

namespace Laba4
{
    class Matrix
    {

        public Matrix(int[] arr)
        {
            for (int i = 0; i < 4; i++)
            {
                arr[i] = Int32.Parse(Console.ReadLine());

            }

        }

        public void Output(int[] arr)
        {
            Console.WriteLine("Your vector");
            for (int i = 0; i < 4; i++)
            {
                System.Console.Write(arr[i] + " ");
            }
        }

        public int Ymova(int[] arr)
        {
            int max = 0;
            for (int i = 0; i < 4; i++)
            {
                if (arr[i] > max) max = arr[i];

            }
            return max;

        }

    }

    class Matrix2d : Matrix
    {

        public Matrix2d(int[,] array) : base(array) // вот тут проблемка
        {

        }

    }


    class Program
    {
        static void Main(string[] args)
        {
            int[] array = new int[4];
            Matrix matrix = new Matrix(array);
            matrix.Output(array);
            Console.WriteLine("max = " + matrix.Ymova(array));

            Console.ReadKey();

        }
    }
}

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

Ответы

▲ 1Принят

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

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

UPD

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

Просвещаю:

Во-первых, не стоит прописывать размер массива прямо в цикле - это говнокодище чистой воды. У вас конструктор принимает некий массив любой длины. Допустим, массив, который вы передаете в конструктор, имеет не четыре, а три элемента. Это значит, что вы получите исключение. Иными словами, вы нигде и никак не указываете потенциальному пользователю вашего класса, что его конструктор ожидает не просто какой-то массив, а массив из четырех элементов. Это крайне плохой подход. Раз уж вам нужен именно массив из четырех элементов, то тогда вовсе не нужно передавать его в конструктор, а нужно его в этом конструкторе создавать. Например так:

public Matrix()
{
    arr = new int[4]; // сам массив arr должен быть объявлен в классе
    for (int i = 0; i < 4; i++)        
        arr[i] = Int32.Parse(Console.ReadLine());        
}

Во-вторых, если уж вам так обязательно иметь именно четыре элемента, то не надо прописывать это в десяти местах. Введите константу, присвойте ей нужное значение и используйте в циклах ее. Тогда вам не потребуется менять это магическое число 4 везде, где оно встречается (и при этом ломать голову, то ли самое число вы меняете, или это какое-то другое "четыре"). Например так:

public class Matrix 
{
    private const int Size = 4;
    private int[] arr = new int[Size];

    public Matrix()
    {            
        for (int i = 0; i < size; i++)            
            arr[i] = Int32.Parse(Console.ReadLine());             
    }
}

В-третьих, не нужно использовать никаких Console.ReadLine в конструкторе. Потому что консольному вводу вообще не место в конструкторе, а главное, потому что ваш класс не должен зависеть от класса Console. Более того, если метод Convert не сможет преобразовать строку в число (а это вполне частый случай, если, скажем, пользователь введет черт знает что), то вы получите исключение, которые вы опять-таки не обрабатываете. Если нужно как-то инициализировать массив, то либо передавайте в конструктор четыре отдельных значения извне, либо инициализируйте его случайными числами. Вариант с передачей массива не очень хорош, об этом я писал выше. Он требует проверки, что массив содержит именно 4 элемента, и, самое главное, никак не говорит пользователю об этом.

В-четвертых, взгляните на ваши методы - все они принимают массив целых чисел, и по факту ничего с ним не делают. Почему? Вы же должны находить наибольшие значения именно вашего вектора, а не какого попало массива, полученного в качестве параметра. Уберите их из параметров и используйте внутреннюю приватную переменную