Как сделать наследование от нескольких классов в C#? Здравствуйте. Все классы должны иметь базовый класс MyBaseClass, чтобы они имели поле BaseObject типа Т и хранили там значения своих полей. Но при наследовании, как в случае с FakeClass2, он наследуется от FakeClass1, а BaseObject у него должен быть типа RealClassForFakeClass2. Возможно ли такое реализовать? На сколько я понимаю, возможно унаследоваться от FakeClass1, а BaseObject перекрыть в самом классе, но хотелось бы, чтобы можно было как-то без перекрытия в самом классе реализовать такой подход или через MyBaseClass или ещё как-то.public class MyBaseClass where T : class, new() { protected T BaseObject = default(T); public T getBaseObject() { return this.BaseObject; } } public class FakeClass1 : MyBaseClass { public string Field1 { set { this.BaseObject.Field1 = value; } } public string Field2 { set { this.BaseObject.Field2 = value; } } }
public class FakeClass2 : FakeClass1, MyBaseClass ////error { public FakeClassN Field1 { set { this.BaseObject.Field1 = value.getBaseObject(); } } }
В C# нельзя наследоваться от нескольких классов, но можно реализовать подобное поведение с использованием интерфейсов. В вашем случае, вместо наследования от нескольких классов, вы можете использовать интерфейсы для определения различных типов BaseObject.
Примерно так:
public interface IBaseClass<T> where T : class, new() { T GetBaseObject(); } public class MyBaseClass<T> : IBaseClass<T> where T : class, new() { protected T BaseObject = default(T); public T GetBaseObject() { return this.BaseObject; } } public class FakeClass1 : MyBaseClass<RealClassForFakeClass1> { public string Field1 { set { this.BaseObject.Field1 = value; } } public string Field2 { set { this.BaseObject.Field2 = value; } } } public class FakeClass2 : FakeClass1, IBaseClass<RealClassForFakeClass2> { public new RealClassForFakeClass2 GetBaseObject() { return this.BaseObject as RealClassForFakeClass2; } public FakeClassN Field1 { set { this.BaseObject.Field1 = value.GetBaseObject(); } } }
Это позволит вам использовать интерфейсы для определения типа BaseObject для каждого класса, сохраняя при этом общую реализацию для методов из базового класса MyBaseClass.
В C# нельзя наследоваться от нескольких классов, но можно реализовать подобное поведение с использованием интерфейсов. В вашем случае, вместо наследования от нескольких классов, вы можете использовать интерфейсы для определения различных типов BaseObject.
Примерно так:
public interface IBaseClass<T>where T : class, new()
{
T GetBaseObject();
}
public class MyBaseClass<T> : IBaseClass<T>
where T : class, new()
{
protected T BaseObject = default(T);
public T GetBaseObject()
{
return this.BaseObject;
}
}
public class FakeClass1 : MyBaseClass<RealClassForFakeClass1>
{
public string Field1
{
set
{
this.BaseObject.Field1 = value;
}
}
public string Field2
{
set
{
this.BaseObject.Field2 = value;
}
}
}
public class FakeClass2 : FakeClass1, IBaseClass<RealClassForFakeClass2>
{
public new RealClassForFakeClass2 GetBaseObject()
{
return this.BaseObject as RealClassForFakeClass2;
}
public FakeClassN Field1
{
set
{
this.BaseObject.Field1 = value.GetBaseObject();
}
}
}
Это позволит вам использовать интерфейсы для определения типа BaseObject для каждого класса, сохраняя при этом общую реализацию для методов из базового класса MyBaseClass.