Как наследовать универсальный класс

#c# #nested-class #generics

#c# #вложенный класс #дженерики

Вопрос:

Работайте на C #.Я хочу наследовать универсальный класс, для этого я пишу следующий синтаксис

  public class Father
    {
        public string FatherName { get; set; }
    }
    public class Mother
    {
        public string MotherName { get; set; }
    }

    public class Ancestors<T, U> 
    {
        //public class Bar
        //{
        //    private T t;
        //    private U u;
        //}
    }


    class Program : Ancestors<Father, Mother>
    {
        static void Main(string[] args)
        {
            Ansestors.Father.FatherName = "xxx";
        }
    }
 

Я хочу, чтобы ансесторы.Отец.FatherName = «xxx»; свойство .В чем проблема моего синтаксиса? Пожалуйста, покажите некоторый синтаксис для решения этой проблемы.если у вас есть какие-либо вопросы, пожалуйста, спросите.Заранее спасибо

Комментарии:

1. «Предки» — это правильное написание — возможно, вы захотите изменить это, прежде чем застрять в неправильном написании, как мы были с referer .

2. Я не думаю, что у вас правильное представление о дженериках…

3. @Dan: К сожалению, они, возможно, уже застряли с «plz»…

4. Необычный взгляд на эволюцию. Что это за религия?

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

Ответ №1:

Похоже, вы не полностью осознали концепцию универсальных классов.

Что вы говорите компилятору с приведенным выше объявлением: всякий раз, когда вы находите T (или U) в коде Program класса, замените его на Father (или Mother ) .

Почему вы ожидаете Program , что класс будет иметь вложенный объект типа Father ? Он нигде не объявлен, все, что вы объявили, это директива разрешения типов для компилятора.

HTH!

Комментарии:

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

2. Конечно, вы можете наследовать от универсального класса, это не проблема. Но то, что вы наследуете от универсального, — это чисто объявления типов, а не объекты. Множественное наследование, которое вы, похоже, имеете в виду, не имеет ничего общего с дженериками. Вам понадобится какая-то композиция объектов. Наследование в C # не работает для таких вещей (слава богу!). Похоже, вам следует обдумать некоторые принципы проектирования программного обеспечения…

Ответ №2:

 class Program
{
    static void Main(string[] args)
    {
        //original parents
        Father father = new Father("George");
        Mother mother = new Mother("Mary");

        //mothers parents aka grandparents
        mother.Mother = new Mother("Ana");
        mother.Father = new Father("Jack");
    }
}

abstract class Ancestor
{
    public String Name { get; set; }
}

public class Father : Ancestor {
    public Mother Mother { get; set; }
    public Father Father { get; set; }

    public Father(String name)
    {
        base.Name = name;
    }
}
public class Mother : Ancestor {
    public Mother Mother { get; set; }
    public Father Father { get; set; }

    public Mother(String name)
    {
        base.Name = name;
    }
}
 

Вы помещаете общие свойства в класс-предок, а конкретные свойства — в материнский или отцовский класс.
Я не понимаю, зачем вам нужны дженерики.

Кстати, для Program class нет смысла наследовать предков…

Ответ №3:

  1. Вы не должны наследовать класс Program, это, скажем, точка входа приложения
  2. Просто создайте экземпляр Ansestors<T, U> class, я слегка переработал класс-предок, см. Ниже:
 public interface IAncestor
{
    string Name { get; set; }
}

public sealed class Father : IAncestor
{
}

public sealed class Mother : IAncestor
{
}

public sealed class ParentsAncestor<T, U> 
 where T: IAncestor
 where U: IAncestor
{
     public ParentsAncestor(T father, U mother)
     {
         this.Father = father;
         this.Mother = mother;
     }

     public T Father { get; private set; }
     public U Mother { get; private set; } 
}

static void Main(string[] args)
{
     var instance = new ParentsAncestor<Father, Mother>(new Father(), new Mother());
     instance.Father.Name = "The father name";
}
 

Комментарии:

1. На самом деле это не проблема, но имена переменных не должны быть такими, поскольку это вводило бы в заблуждение, если бы они использовали Ansestors<Father, Father>;

2. @Ash Burlaczenko: хорошее наблюдение! Я думаю, что их можно было бы абстрагировать как FirstAncestor и SecondAncestor, но это зависит от контекста, в котором также используется этот cass

3. Кстати, таким образом, вы не получаете большой гибкости при использовании дженериков, вы можете вообще избавиться от них и просто выставить свойства отца / матери, вам нужен аргумент класса универсального типа, когда он будет иметь некоторое общее поведение в наборе конкретных классов реализации