C# 访问器和对象 class 继承
C# accessors and object class inheritance
所以我有一个关于对象继承和构造函数的问题可能很幼稚。基本上,一个 class 有一个对象:
public class ParentClass{
protected Parent item;
存取器如下:
public Parent ItemValue
{
set
{
item = value;
}
get
{
return item;
}
}
现在我想继承class:
public class ChildClass:ParentClass
{
public new Child item;
}
现在,每当我通过继承访问器访问 Child item
时,当然,return 将项目作为 Parent
class 而不是 Child
class。有没有办法在不覆盖 ChildClass
?
中的访问器的情况下将 return 设为 item
作为 Child
class
不,您不能将基础 属性 的类型更改为 return 不同的(派生)类型。
不需要继承的标准解决方法 - 通用 class:
public class ParentClass<T> {
public T ItemValue { get; set; }
...
}
public class ChildClass : ParentClass<ChildClass>
{
...
}
请注意,如果您只需要访问其自身的项目 class,您可以只需要 virtual
属性:
public class Parent { }
public class Child:Parent { public string ChildProperty; }
public abstract class ParentClass
{
public abstract Parent ItemValue { get; }
}
public class ChildClass : ParentClass
{
Child item;
public override Parent ItemValue { get {return item;} }
public void Method()
{
// use item's child class properties
Console.Write(item.ChildProperty);
}
}
如果您只想拥有由您的后代定义的类型的项目 class,您可以这样做
public class ParentClass<T>{
protected T item;
public T ItemValue
{
set
{
item = value;
}
get
{
return item;
}
}
}
public class ChildClass:ParentClass<Child>
{
// No need to create a new definition of item
}
然而,根据您的问题,您的下一个问题是当 ChildClass1 和 ChildClass2 具有不同的 T 时如何将它们添加到相同的 List/Array/Dictionary/etc。
退后一步。您的 ParentClass 真的需要知道项目是什么吗?
(Ab)使用上面的动物示例,您的马可能有 Walk()、Trot()、Canter() 或 Gallop() 方法,但鸭子可能有 Swim() 或 Waddle() 方法。
也许您的逻辑是这样的,迭代我的动物 collection 并告诉游泳者游泳。在这种情况下,您可以声明:
using System;
using System.Collections.Generic;
public class Program
{
public class Location {}
public interface ISwimmer{
void SwimTo(Location destination);
}
public class Animal {} // whatever base class properties you need
public class Duck : Animal, ISwimmer
{
public void SwimTo(Location destination)
{
Console.WriteLine("Implement duck's swim logic");
}
}
public class Fish : Animal, ISwimmer
{
public void SwimTo(Location destination)
{
Console.WriteLine("Implement fish's swim logic");
}
}
public class Giraffe : Animal {}
public static void Main()
{
List<Animal> animals = new List<Animal>
{
new Duck(),
new Fish(),
new Giraffe()
};
foreach (Animal animal in animals)
{
ISwimmer swimmer = animal as ISwimmer;
if (swimmer==null) continue; // this one can't swim
swimmer.SwimTo(new Location());
}
}
}
所以我有一个关于对象继承和构造函数的问题可能很幼稚。基本上,一个 class 有一个对象:
public class ParentClass{
protected Parent item;
存取器如下:
public Parent ItemValue
{
set
{
item = value;
}
get
{
return item;
}
}
现在我想继承class:
public class ChildClass:ParentClass
{
public new Child item;
}
现在,每当我通过继承访问器访问 Child item
时,当然,return 将项目作为 Parent
class 而不是 Child
class。有没有办法在不覆盖 ChildClass
?
item
作为 Child
class
不,您不能将基础 属性 的类型更改为 return 不同的(派生)类型。
不需要继承的标准解决方法 - 通用 class:
public class ParentClass<T> {
public T ItemValue { get; set; }
...
}
public class ChildClass : ParentClass<ChildClass>
{
...
}
请注意,如果您只需要访问其自身的项目 class,您可以只需要 virtual
属性:
public class Parent { }
public class Child:Parent { public string ChildProperty; }
public abstract class ParentClass
{
public abstract Parent ItemValue { get; }
}
public class ChildClass : ParentClass
{
Child item;
public override Parent ItemValue { get {return item;} }
public void Method()
{
// use item's child class properties
Console.Write(item.ChildProperty);
}
}
如果您只想拥有由您的后代定义的类型的项目 class,您可以这样做
public class ParentClass<T>{
protected T item;
public T ItemValue
{
set
{
item = value;
}
get
{
return item;
}
}
}
public class ChildClass:ParentClass<Child>
{
// No need to create a new definition of item
}
然而,根据您的问题,您的下一个问题是当 ChildClass1 和 ChildClass2 具有不同的 T 时如何将它们添加到相同的 List/Array/Dictionary/etc。
退后一步。您的 ParentClass 真的需要知道项目是什么吗?
(Ab)使用上面的动物示例,您的马可能有 Walk()、Trot()、Canter() 或 Gallop() 方法,但鸭子可能有 Swim() 或 Waddle() 方法。
也许您的逻辑是这样的,迭代我的动物 collection 并告诉游泳者游泳。在这种情况下,您可以声明:
using System;
using System.Collections.Generic;
public class Program
{
public class Location {}
public interface ISwimmer{
void SwimTo(Location destination);
}
public class Animal {} // whatever base class properties you need
public class Duck : Animal, ISwimmer
{
public void SwimTo(Location destination)
{
Console.WriteLine("Implement duck's swim logic");
}
}
public class Fish : Animal, ISwimmer
{
public void SwimTo(Location destination)
{
Console.WriteLine("Implement fish's swim logic");
}
}
public class Giraffe : Animal {}
public static void Main()
{
List<Animal> animals = new List<Animal>
{
new Duck(),
new Fish(),
new Giraffe()
};
foreach (Animal animal in animals)
{
ISwimmer swimmer = animal as ISwimmer;
if (swimmer==null) continue; // this one can't swim
swimmer.SwimTo(new Location());
}
}
}