#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:
- Вы не должны наследовать класс Program, это, скажем, точка входа приложения
- Просто создайте экземпляр
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. Кстати, таким образом, вы не получаете большой гибкости при использовании дженериков, вы можете вообще избавиться от них и просто выставить свойства отца / матери, вам нужен аргумент класса универсального типа, когда он будет иметь некоторое общее поведение в наборе конкретных классов реализации