C#访问器和对象类继承

时间:2018-04-10 00:02:25

标签: c# inheritance accessor

所以我有一个关于对象继承和构造函数的天真问题。基本上,一个类有一个对象:

public class ParentClass{
protected Parent item;

访问者如下:

public Parent ItemValue
{
    set
    {
        item = value;
    }
    get
    {
        return item;
    }
}

现在我想继承这个类:

public class ChildClass:ParentClass
    {
    public new Child item;
    }

现在,每当我通过继承的访问者访问Child item时,它当然会将该项作为Parent类而不是Child类返回。有没有办法让它返回item作为Child类而不覆盖ChildClass中的访问者?

2 个答案:

答案 0 :(得分:3)

不,您无法更改基本属性的类型以返回不同(派生)类型。

标准解决方法,如果您不需要继承 - 泛型类:

public class ParentClass<T> {
      public T ItemValue { get; set; }
...
}

public class ChildClass : ParentClass<ChildClass> 
{
  ...
}

请注意,如果您只需要访问自己类中的项目,则只能拥有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);
    }
}

答案 1 :(得分:1)

如果你只想让你的后代类定义一个类型的Item,你可以这样做

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添加到同一个List / Array / Dictionary / etc中,如果它们有不同的T&#39。

退后一步。你的ParentClass真的需要知道什么是项目吗?

(Ab)使用上面的Animal示例,你的Horse可能有一个Walk(),Trot(),Canter()或Gallop()方法,但Duck可能有一个Swim()或Waddle()方法。

也许你的逻辑说的是,迭代我的动物收藏并告诉游泳者游泳。在这种情况下,您可以声明:

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());
        }
    }
}