как получить доступ к свойствам дочернего объекта - PullRequest
1 голос
/ 22 апреля 2011

Прошу прощения, если об этом уже спрашивали, но я не знаю, правильно ли я формулирую вопрос:

Итак, допустим, у меня есть следующие классы:

class Shape{
int Area
}

class Triangle:Shape{
string type_of_triangle;
}

class Star:Shape{
int Number_of_Points;
}

и функция, возвращающая список с типом фигуры, который содержит в себе объекты треугольника и фигуры. когда я пытаюсь получить доступ к свойствам треугольника или звезды, Visual Studio только позволяет мне получить доступ к свойствам родителя.

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

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011
Shape unknownShape = new Triangle();

if(unknownShape is Triangle){
    ((Triangle)unknownShape).type_of_triangle;
}
0 голосов
/ 22 апреля 2011

Я бы посоветовал немного больше подумать над дизайном вашей иерархии классов.Вдобавок ко всему, я хотел бы предложить вам поместить все свойства, которые вы определили для ваших производных форм, в родительский объект.Кроме того, вы можете рассмотреть возможность создания некоторых из них методов, которые возвращают значения.

Хотя это не является частью вашего текущего примера, любая фигура, включая круг, имеет конечное число точек (круг просто имеет ноль).Универсальное свойство shape_family может представлять классификацию строк для конкретного производного класса формы («Треугольник», «Звезда» и т. Д.).

Тип shape_sub может представлять определенные варианты («Прямоугольный треугольник», «Изоцелеобразный треугольник» и т. Д.).Затем, если вы определите точки как, ну, ТОЧКИ и добавите их в список, у вас будет не только определенное местоположение для них (если это не выходит за рамки вашей программы), но у вас также будет счет.Оттуда вы, вероятно, сможете разработать дополнительную логику для отображения сторон / вертикалей и вычислить такие вещи, как площадь, периметр и т. Д.vb.net, поэтому, если я раскрою код здесь, постараюсь сосредоточиться на структуре класса, а НЕ на моем синтаксисе ...):

Редактировать: 22.04.2011 7:41 - Упс.Забыл сделать Класс абстрактным.Если методы класса определены как «абстрактные», то и сам класс также должен быть абстрактным, то есть нельзя напрямую создавать экземпляр абстрактной базы.Вот ссылка на дополнительную информацию об абстрактных классах и методах /

public abstract class Shape
{ 
    int Area; 
    string shape_family;
    string shape_subtype;
    list<point> Points

    public int number_of_points()    
    {
        return points.count
    }        
    public abstract int perimeter_lenngth()
    public abstract int area()
}  

class Triangle : Shape { 

    //Example of Triangle-specific implementation:
    public override int perimiter_length {
       //You code to obtain and compute the lengths of the sides
    }

    //Example of Triangle-specific implementation:
    public override int area {
        //Your code to obtain and compute        
    }
}

class Star : Shape{

    //Example of Star-specific implementation:
    public override int perimiter_length {
       //Your code to obtain and compute the lengths of the sides
    }

    //Example of Star-specific implementation:
    public override int area {
        //Your code to obtain and compute        
    }
}

class Circle : Shape {
    point center;
    int radius

    // Example of Circle-specific implementation:
    public override int perimiter_length {
        return 2*3.14*radius
    }

    // Example of Circle-specific implementation:
    public override int area {
        return 3.14*radius^2
    }
}
...