Теория объектно-ориентированного наследования C#

Все,

У меня есть следующая логика дизайна:

Родительский (или базовый?) класс: Person
Passenger наследуется от Person
Сотрудник наследует от Человека

Я планирую использовать следующую структуру с классами Passenger и Employee:

        public struct LocationList
        {
            Location LocationName;
            DateTime RequiredArrivalTime;
            DateTime ActualArrivalTime;
        };

Я думал, что логичным местом для структуры будет класс Person, но C# не допускает наследование структур.

Второе редактирование: после вопроса Экке:

Мой код выглядит следующим образом:

Класс человека:

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

namespace Airport_Server
{
    public class Person
    {
        public struct LocationList
        {
            Location LocationName;
            DateTime RequiredArrivalTime;
            DateTime ActualArrivalTime;
        };
    }
}

Пассажирский класс:

using Microsoft.Data.SqlClient;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Drawing.Imaging;
using System.Text;

namespace Airport_Server
{
    public class Passenger : Person
    {
        private float Cash;
        public DateTime FinishAtCurrentLocation;
        public LocationAction CurrentLocationAction;
        public int PassengerID;
        private static int NextPassengerNo;
        public List<LocationList> AreaTimePlan;
        protected Location CurrentArea;
        private bool bolNextArea;
        private DateTime NextAreaTime;

        public DateTime GetNextAreaTime()
        {
            foreach (LocationList InvLocation in AreaTimePlan)
            { 
                if (InvLocation.LocationName.Title==CurrentArea.Title) << Error 'Person.LocationList.LocationName is inaccessible due to it's protection level
                {
                    bolNextArea = true;

                }
                if (InvLocation.LocationName.Title != CurrentArea.Title && bolNextArea=true)
                {
                    NextAreaTime = InvLocation.RequiredArrivalTime;
                    bolNextArea = false;
                }
            }
            return NextAreaTime;

        }
    }
}

Первое редактирование: в абзац добавлен следующий комментарий:

Причина, по которой я намереваюсь использовать структуру вместо отдельных переменных, заключается в том, что у меня будет их список. Если нет варианта, о котором я не знаю; если бы я использовал отдельные переменные, мне понадобилось бы несколько списков, что кажется более сложным вариантом?

Я мог бы решить эту проблему, превратив структуру LocationList в класс, но я не уверен, что это лучший способ? Это похоже на небольшое требование для своего собственного класса, поэтому мне интересно, пропустил ли я вариант или концепцию объектно-ориентированного дизайна?

Я мог бы поместить структуру в Passenger и Employee, но я пытаюсь избежать дублирования.

Я изучил объектно-ориентированный дизайн с помощью Java, и это было довольно давно. Я учу себя c# и стараюсь не приобретать вредных привычек.

Спасибо

Моя причина использования структуры в том, что у меня будет их список. что вы имеете в виду о списках

Jameel Nazir 23.12.2020 12:05

вы также можете использовать списки с классами

Jameel Nazir 23.12.2020 12:19

Спасибо за вашу помощь. Я отредактировал свой вопрос, чтобы, надеюсь, прояснить причину использования структуры/класса для LocationList.

user983325 23.12.2020 12:38

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

ekke 23.12.2020 12:50

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

user983325 23.12.2020 13:08

дублирующий вопрос stackoverflow.com/questions/15408667/inherit-from-struct

Jameel Nazir 23.12.2020 13:21

вы можете прочитать там все подробности

Jameel Nazir 23.12.2020 13:23

Как правило, в С# вы должны использовать классы только до тех пор, пока не будете хорошо знать различия между ссылочными типами и типами значений. Я вижу, вы пытаетесь использовать структуру, как в C++, а структуры в C++ сильно отличаются от структур в C#.

ghord 23.12.2020 13:29

ghord: Спасибо за совет. Я немного почитаю о ссылочных типах и типах значений, чтобы понять разницу.

user983325 23.12.2020 13:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исправление состоит в том, чтобы добавить модификатор доступа public к свойствам LocationList, чтобы к ним можно было получить доступ вне этого класса/структуры. Без этого по умолчанию используется private, что означает, что они доступны только внутри этого типа.

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

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

public class Person
{
    public struct LocationList
    {
        public Location LocationName;
        public DateTime RequiredArrivalTime;
        public DateTime ActualArrivalTime;
    };
}

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

user983325 23.12.2020 13:38

Другие вопросы по теме