C# 如何避免类继承绕过?

C# 如何避免类继承绕过?,c#,inheritance,C#,Inheritance,我遇到了一个很难解释的问题。考虑3类;A、 B和C。以下继承代码位于C#伪代码中: class A { public int x1 { get; set;} public int x2 { get; set;} } class B : A { public Property SomeProperty { get { return new Property(base.x1, base

我遇到了一个很难解释的问题。考虑3类;A、 B和C。以下继承代码位于C#伪代码中:

class A 
{
    public int x1 { get; set;}
    public int x2 { get; set;}
}

class B : A
{
     public Property SomeProperty 
     { 
          get 
          {
               return new Property(base.x1, base.x2);
          }
          set
          {
               base.x1 = value.x1;
               base.x2 = value.x2;
          }
     }
}

class C : B
{
     public Property SomeProperty 
     {
         get 
         {
             return base.SomeProperty;
         }
         set
         {
             base.SomeProperty = new Property(value.x1 * 2, value.x2 * 2);
         }
     }
}
请注意,A类和B类的源代码不能更改。 我正在处理的模块包含C类的声明和定义。因此,如果我必须更改任何内容,它必须在C类中更改

该模块的主要问题之一是有200多个功能,如下所示:

function (A objOfA)
{
    objOfA.x1 = 2;
    objOfA.x2 = 3;
}

function1()
{
    function(new C());
}
上述函数调用产生的问题是,在派生类C中编写的任何内容都被完全绕过,因为objOfA的类型是A。不幸的是,我无法更改这些函数,因为许多模块依赖于这些函数

那么有没有一种方法,即使对象的类型是a,C的函数也是被调用的

那么有没有一种方法,即使对象的类型是a,C的函数也是被调用的


方法是使这些成员
虚拟
,然后
在派生类型中重写它们。但是,它们需要在基类中声明为
virtual
,才能作为选项。没有办法重写非虚拟成员。

函数在类C中??没有。实际上在完全不同的命名空间中有。如何
公共属性SomeProperty{get{return new Property(x1*2,x2*2);}set{x1=value.x1/2;x2=value.x2/2;}
?这假设您实际上可以从
属性
@BartvanNieop中获取这些值,这是一种有趣的方式。。我看看是否能用这个逻辑。谢谢:)@Bart van Nieop,再想想。但我认为这在我的情况下行不通。该属性实际上是WinForms中控件的大小。绘制控件时,它将引用控件类(基类)中的大小。或者,如果可能,使用参数接口。@Styxxy基类类型不能修改,这意味着不能使其实现接口。还请注意,使用接口将强制方法的虚拟分派,因此接口在这里可能合适,也可能不合适,但真正的键只是具有虚拟分派。@Servy这是不可能的。实际上,类A和B是WinForms的控件类和按钮类。SomeProperty实际上是控件的Size属性。所以A和B是我无法控制的。还有其他方法吗?@johnny5他已经在使用成员隐藏,不,它不起作用。这就是重点。当对象被静态类型化为其基类时,隐藏方法不会改变行为,只有重写虚拟方法才能做到这一点。@Abhinav-您对Size属性的重写与控件类中的标准Size属性有何不同?你打算改变什么?为什么?我注意到
Control
类的
MinimumSize
maxiumsize
属性被标记为virtual。你能和他们一起工作吗?