Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Наследование


Автор: Doss 18.10.2007, 21:06
Не смотрите пожалуйста на саму задачу, прошу обратить внимание на семантику! Не могу понять, как вызвать метод из уноследованного класса, если создан массив экземпляра класса..
Пробывал непосредственно вызвать, но что то не пойму, ругается, что неоходимо конвертировать переменную...ну и все такое...в коде написано подробно где нужно вызвать
Код

using System;
using System.Collections.Generic;
using System.Text;

namespace Lab9
{
    class Point [color=limegreen]// Базовый класс -точка[/color]
    {
        public Point()
        {
          
            this.point = 25;

        }
      
        public Point(int point)
            : this()
        {
            this.point =point;
        }
        
       
        public int Getpoint
        {
            get
            {
                return point;
            }
            set
            {
                if (value > 0) point = value;
                else point = 0;
            }
        }
       virtual public void Passport()
        {
            Console.WriteLine("Точка={0}\t ",  point);
        }
       
        int point;
    }



    class ColoredPoint:Point[color=green]//класс потомок от Point[/color]
    {
        public ColoredPoint()
        {
           color = "blue";
        }
        public ColoredPoint(int point,string color)
            : base(point)
        {
            this.color = color;
        }
        public string GetColor
        {
            get
            {
                return color;
            }
            set
            {
                if (color != null) color = value;
                else Console.WriteLine("Вы ввели на строковое значение");
            }
        }
       
        override public void Passport()
        {
            Console.WriteLine("Точка={0}\t Цвет точки={1}\t ", Getpoint , color );
        }
       string color;
       
    }



   class Line : Point[color=green]//Класс линия потомок класса Point[/color]
    {
        public Line()
        {
            line = 50;
           
        }
        public Line(int point,int line)
            : base(point)
        {
            this.line = line;
           
        }
       public int GetLine
       {
           get
           {
               return line;
           }
           set
           {
               if (value > 0) line = value;
               else line = 0;
           }
       }
      
      
       override public void Passport()
       {
           Console.WriteLine("Точка={0}\t Линия={1}\t ", Getpoint, line);
       }
        int line;
      
    }



    class ColoredLine : Line[color=green]//Класс потомок Line  и содержит метод который необходимо вызвать в Main[/color]
    {
        double  x,y;
       public ColoredLine()
        {
         this.x = 23 ;
        }
     /*   public double GetX
        {
            get
            {
                return x;
            }
        }*/
       public void Ugol(double x)
        {
            y = Math.Cos (x);
            Console.WriteLine("Угол" + y);
           // return y;
        }
        
       /* override public void Passport()
        {
            Console.WriteLine("Угол=\t "+y);
        }*/
    }




      class PolyLine:Line[color=green]//Также содержит метод его тоже необх вызвать[/color]
        {
                 
          public void  Mashtab(double  line)
            {
                line+= 100;  
               // return line ;
                Console.WriteLine("Масштаб"+line );

            }
         /* override public void Passport()
          {
              Console.WriteLine("Масштаб=\t "+ line);
          }*/
           double  line;
          
            

    }


   
    class Program
    {
        static void Main()
        {
           
            const int n = 3;
            Point[] picture = new Point[n];[color=green]//Массив содержащий ссылки   [/color]
            
            picture[0] = new Point(23);
            picture[1] = new ColoredPoint(100,"Красный");
            picture[2] = new Line(123,4);
            picture[3] =;            [color=green] //Здесь необходимо вызвать метод из класса ColorLine[/color]          
           // picture[4] = 


            foreach (Point elem in picture) elem.Passport();
            ColoredLine f = new ColoredLine();
            f.Ugol(3);
            PolyLine t = new PolyLine();
            t.Mashtab(1);


Автор: 1stain 18.10.2007, 22:28
великодушно извините, что это такое?  smile 
Код

    class Point [color=limegreen]// Базовый класс -точка[/color]

Автор: 0000 19.10.2007, 00:38
я бы вынес все эти вещи в интерфейсы..
например так

Код

interface IPoint
{
     void Pasport();
     int value {get; set; }
     Color color {get; set; }
}
interface ILine : IPoint
{
     void Ugol (double x);
     void Mashtab(double line);
}


и дальше при создании коллекции List<IPoint> для вызова методов Ugol и Mashtab можешь проверить элемент - реализует он интерфейс ILine или нет

не факт, что так путево будет - но это первое, что приходит в голову в 2 часа ночи...  smile 

Автор: 1stain 19.10.2007, 08:42
Код

class Program
    {
        static void Main(string[] args)
        {
            BaseClass[] baseClassArray = new BaseClass[4]{new BaseClass(), new Derived2(), 
                new Derived3(), new Derived1() };

            for (int i = 0; i < baseClassArray.Length; ++i)
            {
                if ( baseClassArray[i].GetType() == typeof( Derived3 ))
                {
                    Derived3 d3 = baseClassArray[i] as Derived3;
                    Console.WriteLine("{0}Вызов всех методов, которые может вызвать Derived3 объект", Environment.NewLine);
                    d3.Derived3Method();
                    d3.Derived2Method();
                    d3.Derived1Method();
                    d3.BaseClassMethod();
                }
                else if ( baseClassArray[i].GetType() == typeof(Derived2) )
                {
                    Derived2 d2 = baseClassArray[i] as Derived2;
                    Console.WriteLine("{0}Вызов всех методов, которые может вызвать Derived2 объект", Environment.NewLine);
                    d2.Derived2Method();
                    d2.Derived1Method();
                    d2.BaseClassMethod();
                }
                else if ( baseClassArray[i].GetType() == typeof(Derived1) )
                {
                    Derived1 d1 = baseClassArray[i] as Derived1;
                    Console.WriteLine("{0}Вызов всех методов, которые может вызвать Derived1 объект", Environment.NewLine);
                    d1.Derived1Method();
                    d1.BaseClassMethod();
                }
                else
                {
                    Console.WriteLine("{0}Вызов метода класса BaseClass", Environment.NewLine);
                    baseClassArray[i].BaseClassMethod();
                }
            }
        }
    }

    class BaseClass
    {
        public void BaseClassMethod()
        {
            Console.WriteLine(String.Format("{0}.BaseClassMethod", this.GetType().Name));
        }
    }

    class Derived1 : BaseClass
    {
        public void Derived1Method()
        {
            Console.WriteLine(String.Format("{0}.Derived1Method", this.GetType().Name));
        }
    }

    class Derived2 : Derived1
    {
        public void Derived2Method()
        {
            Console.WriteLine(String.Format("{0}.Derived2Method", this.GetType().Name));
        }
    }

    class Derived3 : Derived2
    {
        public void Derived3Method()
        {
            Console.WriteLine(String.Format("{0}.Derived3Method", this.GetType().Name));
        }
    }


Иерархию классов проверять от самого последнего наследника по порядку до базового класса

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)