Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2018, 11:21   #1
FBB
Пользователь
 
Регистрация: 04.09.2017
Сообщений: 13
По умолчанию запуск метода класса наследника

Здравствуйте!
Немогу никак сообразить как решить вот такую проблему не создавая лишних переменных-объектов .
Есть основной класс Product от него наследуется
ValueMeal : Product

В ValueMeal добавлена ф-ия - Boolean IsAviable()

В Main классе я создаю список List<Product> , куда заганяю екземпляр ValueMeal -

Код:
 productList.Add(new ValueMeal());
а вот когда я пытаюсь вызвать эту фунцию в Main ,точно зная , что 0-вой элемент списка точно ValueMeal
Код:
productList.ElementAt(0).GetType().GetMethod("isAviable",BindingFlags.Public)
то компилятор сообщает, что нельзя неявно преобразовать System.Reflection.MethodInfo в bool . Что в принципе и понятно.

Суть вопроса - каким образом можна вызвать метод/ф-цию в данном случае, не создавая лишних объектов/переменных ?
Спасибо.
FBB вне форума Ответить с цитированием
Старый 22.01.2018, 11:38   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Язык программирования какой?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.01.2018, 11:56   #3
FBB
Пользователь
 
Регистрация: 04.09.2017
Сообщений: 13
По умолчанию запуск метода класса наследника

пробую на С#
FBB вне форума Ответить с цитированием
Старый 22.01.2018, 12:11   #4
gantzboss
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 31
По умолчанию

наверное я не понимаю суть задачи, но метод разве вызвать так нельзя?
Код:
productList[0].IsAviable();
gantzboss вне форума Ответить с цитированием
Старый 22.01.2018, 12:27   #5
FBB
Пользователь
 
Регистрация: 04.09.2017
Сообщений: 13
По умолчанию

Тогда я получу вот это -
Цитата:
Ошибка CS1061 'Product" не содержит определения для "isAviable" и не удалось найти метод расширения "isAviable", принимающий тип "Product" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
FBB вне форума Ответить с цитированием
Старый 22.01.2018, 12:41   #6
gantzboss
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 31
По умолчанию

определите его(virtual) в родителе и переопределите его(override) в классе наследнике
Код:
public class Program
    {
        class Product{
            public virtual bool IsAviable(){
                return false;
            }
        }
        class ValueMeal:Product{
            public override bool IsAviable(){
                return true;
            }
        }
        public static void Main(string[] args)
        {
            List<Product> productList= new List<Product>();
            productList.Add(new ValueMeal ());
            Console.WriteLine(productList[0].IsAviable());
        }
    }
если вам не критично, просто нету на компьютере "VS" так приходиться годать
gantzboss вне форума Ответить с цитированием
Старый 22.01.2018, 13:05   #7
FBB
Пользователь
 
Регистрация: 04.09.2017
Сообщений: 13
По умолчанию

вариант override не подходит. Обязательное условие, что класс Product не имеет
метода isAviable, он появляется тоько в "наследнике" ValueMeal. А в список productList
попадают разные "наследники" класса Product .
FBB вне форума Ответить с цитированием
Старый 22.01.2018, 13:10   #8
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Выложите полный код. А то не понятно ничего что вы там куда загоняете.

И вообще у вас как то странно сделано. Получается что какие то продукты могут быть доступными а у каких то вообще нету подобного свойства. Это например что?
если брать магазин то есть продукты: сыр, колбаса, чайник, ковер. где сыр,колбаса это ValueMeal и можно по свойству определить доступны ли они в магазине. А как же с чайником и ковром??
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 22.01.2018 в 13:16.
WorldMaster вне форума Ответить с цитированием
Старый 22.01.2018, 13:28   #9
FBB
Пользователь
 
Регистрация: 04.09.2017
Сообщений: 13
По умолчанию

Класс Product -
Код:
public class Product
    {
        public string name;
        public double price;
        public Product()
       
        public  Product(string nm, double pr)
        {
            name = nm;
            price = pr;
        }
        public virtual double GetPrice()
        {
            return price;
        }
        public virtual string toString()
        {
            return price.ToString();
        }
    }
Класс ValueMeal -
Код:
 class ValueMeal : Product
    {
        DateTime startTime;
        DateTime endTime;
       

        public ValueMeal(string nm, double pr, DateTime st, DateTime et)
        : base(nm, pr)
        {
            startTime = st;
            endTime = et;
        }

        public override double GetPrice()
        {
            return base.GetPrice();
        }

        public Boolean IsAviable()
        {
            return (this.startTime <= DateTime.Now && this.endTime >= DateTime.Now);
        }

        public override string ToString()
        {
            return base.toString(); 
        }
    }
Форма -
Код:
 public partial class Form1 : Form
    {
         public List<Product> productList;
         public Form1()
         
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            productList.Add(new ValueMeal("Humburger", 6.9, Convert.ToDateTime("10:00:00 AM"), Convert.ToDateTime("7:00:00 PM")));
            //Side и Beverage тоже наследуются от Product
             productList.Add(new Side("Fries", 3.70)); 
             productList.Add(new Beverage("Cola", 2.85,0));
           //А вот тут уже начинается проблема 
            if (productList.ElementAt(0).isAviable())
             {
               // то что-нибудь делаем  
               ;
              }                
         }

 }
FBB вне форума Ответить с цитированием
Старый 22.01.2018, 13:42   #10
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Ну во первых поправить надо классы. Потому как лишнего написали.

Код:
public class Product
    {
        public string name;
        public double price;
        public Product()
        {
        }

        public Product(string nm, double pr)
        {
            name = nm;
            price = pr;
        }

// нет смысла делать виртуальный если везде вы вызываете базовый метод
        public double GetPrice()
        {
            return price;
        }

// тут тоже нет смысла писать свой когда можно переопределить базовый меод
        public override string ToString()
        {
            return price.ToString();
        }
    }
Код:
 class ValueMeal : Product
    {
        DateTime startTime;
        DateTime endTime;

        public ValueMeal(string nm, double pr, DateTime st, DateTime et)
        : base(nm, pr)
        {
            startTime = st;
            endTime = et;
        }

        public Boolean IsAviable()
        {
            return (this.startTime <= DateTime.Now && this.endTime >= DateTime.Now);
        }
    }
в основном коде тогда уж делайте вот так
Код:
productList.Add(new ValueMeal("Humburger", 6.9, Convert.ToDateTime("10:00:00 AM"), Convert.ToDateTime("7:00:00 PM")));
            //Side и Beverage тоже наследуются от Product
             productList.Add(new Side("Fries", 3.70)); 
             productList.Add(new Beverage("Cola", 2.85,0));

// отбираем только нужный нам класс
            List<Product> mealList = productList.Where(item => (item as ValueMeal) != null).ToList();

// в вашем случае обязательно приведение типов раз не все имеют такой метод
            if ((mealList [0] as ValueMeal).IsAviable())
            {
                // то что-нибудь делаем  
            }
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Публичные методы класса наследника Heneken87 Общие вопросы Delphi 1 16.06.2017 15:03
C++ Builder Создание класса-наследника TImage Pilyla C++ Builder 1 04.01.2014 14:53
Полиморфизм. Идентификация класса-наследника Сtrl Общие вопросы C/C++ 13 19.07.2011 22:42
конструктор наследника абстрактного класса tiger() Visual C++ 5 15.05.2011 07:16
Netbeans редактирование фрейма из класса не наследника Nicko_mt Общие вопросы по Java, Java SE, Kotlin 3 19.04.2011 15:35