C# C语言中的子类化与泛型#

C# C语言中的子类化与泛型#,c#,C#,我想对大量的类进行子类化,以便它们都包含一组相同的属性。为了避免重复,正确的方法是什么?我想过使用泛型,比如: public class SuperT<T> : T { //the same set of properties } public class SuperT:T { //同一组属性 } 但是编译器说 无法从“T”派生,因为它是类型参数 编辑:我试图在第三方程序集中对某些类进行子类化,因此无法使用基类 例如,类型是“Image”、“Label”、“Button”

我想对大量的类进行子类化,以便它们都包含一组相同的属性。为了避免重复,正确的方法是什么?我想过使用泛型,比如:

public class SuperT<T> : T
{
    //the same set of properties
}
public class SuperT:T
{
//同一组属性
}
但是编译器说

无法从“T”派生,因为它是类型参数


编辑:我试图在第三方程序集中对某些类进行子类化,因此无法使用基类

例如,类型是“Image”、“Label”、“Button”等,我想对它们进行子类化,以包含像“Radius”这样的属性。(因此,我将在XAML中使用SuperImage元素,当我从XAML设置它的Radius属性时,我将能够运行某些特定的逻辑。)

我现在想到的另一种方法是使用T4模板。我想知道是否有一种方法可以在不使用模板的情况下使用泛型实现这一点?我无法理解编译器为什么拒绝它。

只需使用基类:

public class Base
{
    public int Id { get; set; }
    public string Name { get; set; }
}
并从中继承:

public class A : Base
{

}

public class B : Base
{

}
只需使用基类:

public class Base
{
    public int Id { get; set; }
    public string Name { get; set; }
}
并从中继承:

public class A : Base
{

}

public class B : Base
{

}

我不认为泛型与此有任何关系,但是继承可能是您想要的

有两种类型的继承可用于子类,而扩展方法可用于“超类”。。。有点

  • 这是遗产吗
  • 有继承权
  • 为了简单地向一堆第三方对象添加一个类似的方法,您将使用一个扩展方法

  • 这是遗产吗 如果您有类似的方法实现,请使用基类

    public abstract class BaseFoo {
    
        public void Bar() {
             // actual code
        }
    }
    
    public class Foo : BaseFoo
    {
    }
    
    如果需要在每个类上实现相同的方法,请使用接口

    public interface IFoo {
        void Bar();
    }
    
    public class Foo : IFoo {
        public override void Bar(){
            // bar implementation
        }
    }
    
    也允许将两者结合起来,但只能在基类上继承,在基类中可以继承多个接口


    有继承权 这对于依赖项注入特别有用,但这只是一个概念,即您有另一个类的实例可以使用。它本质上是一个供您使用的包装器类

    public class Foo {
        private readonly ThirdPartyFoo _tpFoo;
        void Foo(ThirdPartyFoo tpFoo) {
            _tpFoo = tpFoo;
        }
    
        public void Bar(){
            // now I can do something with _tpFoo;
           _tpFoo.Bar(); 
        }
    }
    

    最后,如果只需要向现有类添加一个方法,那么就创建一个扩展方法

    public static class ViewExtensions() 
    {
        // this assumes your Image, Button, Label all inherit from View.
        public static Whatever Radius(this View view) {
            // do your radius work.
        }
    
    }
    
    public static class ShapeExetnsionsExtLib
    {
        public static double Radius(this ShapeBase shape){
            return /*calculate radious*/;
        }
    }
    

    我不认为泛型与此有任何关系,但是继承可能是您想要的

    有两种类型的继承可用于子类,而扩展方法可用于“超类”。。。有点

  • 这是遗产吗
  • 有继承权
  • 为了简单地向一堆第三方对象添加一个类似的方法,您将使用一个扩展方法

  • 这是遗产吗 如果您有类似的方法实现,请使用基类

    public abstract class BaseFoo {
    
        public void Bar() {
             // actual code
        }
    }
    
    public class Foo : BaseFoo
    {
    }
    
    如果需要在每个类上实现相同的方法,请使用接口

    public interface IFoo {
        void Bar();
    }
    
    public class Foo : IFoo {
        public override void Bar(){
            // bar implementation
        }
    }
    
    也允许将两者结合起来,但只能在基类上继承,在基类中可以继承多个接口


    有继承权 这对于依赖项注入特别有用,但这只是一个概念,即您有另一个类的实例可以使用。它本质上是一个供您使用的包装器类

    public class Foo {
        private readonly ThirdPartyFoo _tpFoo;
        void Foo(ThirdPartyFoo tpFoo) {
            _tpFoo = tpFoo;
        }
    
        public void Bar(){
            // now I can do something with _tpFoo;
           _tpFoo.Bar(); 
        }
    }
    

    最后,如果只需要向现有类添加一个方法,那么就创建一个扩展方法

    public static class ViewExtensions() 
    {
        // this assumes your Image, Button, Label all inherit from View.
        public static Whatever Radius(this View view) {
            // do your radius work.
        }
    
    }
    
    public static class ShapeExetnsionsExtLib
    {
        public static double Radius(this ShapeBase shape){
            return /*calculate radious*/;
        }
    }
    

    通常,您希望使用已经发布的关于使用基类并从基类继承的答案之一。但是,如果类位于第三方库中并且标记为
    密封的
    ,则需要创建一个包装类以用作基类

    (请注意,此选项是一种变通方法,不会真正从第三方类继承,因此,如果不自由使用反射,将无法访问该类中标记为受保护的内容。)


    通常,您希望使用已经发布的关于使用基类并从基类继承的答案之一。但是,如果类位于第三方库中并且标记为
    密封的
    ,则需要创建一个包装类以用作基类

    (请注意,此选项是一种变通方法,不会真正从第三方类继承,因此,如果不自由使用反射,将无法访问该类中标记为受保护的内容。)


    如果这些类都共享一个公共基类或公共接口,那么您可以编写一个扩展方法

    public static class ViewExtensions() 
    {
        // this assumes your Image, Button, Label all inherit from View.
        public static Whatever Radius(this View view) {
            // do your radius work.
        }
    
    }
    
    public static class ShapeExetnsionsExtLib
    {
        public static double Radius(this ShapeBase shape){
            return /*calculate radious*/;
        }
    }
    

    根据评论


    我试图在第三方程序集中对某些类进行子类化,因此无法使用基类

    例如,类型是“Image”、“Label”、“Button”等,我想对它们进行子类化,以包含一个类似“radius”的属性

    是的,它们共享公共基类,但我不能给它们添加任何新的内容


    如果这些类都共享一个公共基类或公共接口,那么您可以编写一个扩展方法

    public static class ViewExtensions() 
    {
        // this assumes your Image, Button, Label all inherit from View.
        public static Whatever Radius(this View view) {
            // do your radius work.
        }
    
    }
    
    public static class ShapeExetnsionsExtLib
    {
        public static double Radius(this ShapeBase shape){
            return /*calculate radious*/;
        }
    }
    

    根据评论


    我试图在第三方程序集中对某些类进行子类化,因此无法使用基类

    例如,类型是“Image”、“Label”、“Button”等,我想对它们进行子类化,以包含一个类似“radius”的属性

    是的,它们共享公共基类,但我不能给它们添加任何新的内容


    首先,这可能是一个逻辑问题。如果要扩展一个密封类,该怎么办?还是Int32类代表


    无论如何,我推荐的方法是创建一个接口并实现子类中所需的所有函数。

    首先,这可能是一个逻辑问题。如果要扩展一个密封类,该怎么办?还是Int32类代表


    无论如何,我推荐的方法是创建一个接口并实现子类中所需的所有函数。

    继承和泛型是两个完全不同的概念。听起来你只是想利用继承。使用基类或接口。在这种情况下,泛型不是“合适的工作工具”。我试图在第三方程序集中对某些类进行子类化,因此我不能使用ba