C# 重写具有相同名称但类型不同的属性

C# 重写具有相同名称但类型不同的属性,c#,inheritance,C#,Inheritance,我想知道是否有一种方法可以在派生类中用不同的类型重写具有相同名称的变量。与此类似的内容(尽管此代码不会编译): 这样做的原因是A和B可能具有相似的属性,只是点的维度不同。您不能覆盖它,但可以使用新的关键字来刺激覆盖(阴影) 注意:如果对类别B的引用是类型A,则将获得A属性而不是B属性。 这意味着您在使用new关键字隐藏基类属性时必须非常小心 关于new和override 当派生类属性类型派生自基类属性类型时,使用new关键字而不是重写属性非常有用 您不能覆盖它,但可以使用new关键字刺激覆盖(阴

我想知道是否有一种方法可以在派生类中用不同的类型重写具有相同名称的变量。与此类似的内容(尽管此代码不会编译):


这样做的原因是
A
B
可能具有相似的属性,只是
点的维度不同。

您不能覆盖它,但可以使用
新的
关键字来刺激覆盖(阴影)

注意:如果对类别B的引用是类型A,则将获得A属性而不是B属性。
这意味着您在使用new关键字隐藏基类属性时必须非常小心

关于
new
override


当派生类属性类型派生自基类属性类型时,使用
new
关键字而不是重写属性非常有用

您不能覆盖它,但可以使用
new
关键字刺激覆盖(阴影)

注意:如果对类别B的引用是类型A,则将获得A属性而不是B属性。
这意味着您在使用new关键字隐藏基类属性时必须非常小心

关于
new
override


当派生类属性类型派生自基类属性类型时,使用
new
关键字而不是重写属性非常有用

你说的是
泛型

public class YourBaseClass<T>
    where T: class
{
    public T Point { get; set; }
}

public class A : YourBaseClass<Point2D>
{
}

public class B : YourBaseClass<Point3D>
{
}
A
实例的点的类型为
Point2D
(在本例中为
null
,因为引用类型属性尚未初始化。)

注意:在这种情况下使用泛型的原因是为派生类指定
属性的返回类型。

使用泛型比使用
virtual
关键字隐藏基类的属性并定义一个
new
one(也称为执行阴影)要好得多。现在,您有了一个具有“可设置”返回类型的基本属性,而不是多个相互隐藏的属性。

您正在谈论的是
泛型

public class YourBaseClass<T>
    where T: class
{
    public T Point { get; set; }
}

public class A : YourBaseClass<Point2D>
{
}

public class B : YourBaseClass<Point3D>
{
}
A
实例的点的类型为
Point2D
(在本例中为
null
,因为引用类型属性尚未初始化。)

注意:在这种情况下使用泛型的原因是为派生类指定
属性的返回类型。

使用泛型比使用
virtual
关键字隐藏基类的属性并定义一个
new
one(也称为执行阴影)要好得多。现在您有了一个具有“可设置”返回类型的基属性,而不是多个相互隐藏的属性。

仅供参考:仅供参考:一般来说,从基类中隐藏成员会导致一整类新问题,我建议不要这样做。@LasseV.Karlsen我同意应该格外小心地使用它,但如果使用得当,它会非常有用。我在回答中添加了一个澄清。一般来说,从基类跟踪成员会导致一系列新问题,我建议不要这样做。@LasseV.Karlsen我同意应该格外小心地使用它,但如果使用得当,它会非常有用。我在回答中加了一个说明。
var a = (new A()).Point;
var type = a.GetType();
var point2D = (new A()).Point as Point2D;