C#和JavaScript类与类之间关系

本文详细介绍了面向对象编程中类之间的六种关系:关联、泛化、依赖、聚合、组合,通过实例展示了它们的区别和应用场景,包括单向关联、双向关联、自身关联、多维关联、继承和组合等,并探讨了它们在代码实现和生命周期上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在面向对象中,类之间的关系有六种,分别是:

  1. 关联关系(Association)
  2. 泛化关系(Generalization)
  3. 依赖(Dependency)
  4. 聚合(Aggregation)
  5. 组合(Composite)

类与类之间关系

关联(Association)

两个相对独立的对象,当一个对象的实例与另一个对象的实例存在固定关系时,这两个对象之间就存在关联关系,关联体现的是一种强关联关系,关联关系形式有四种:单向关联、双向关联、自身关联和多维关联。

单向关联
场景:订单和商品,订单中包含商品,但是商品并不知道订单的存在。
UML类图:

C#:

 public class Order
    {
        public List<Product> products;
 
        public Order()
        {
            products = new List<Product>();
        }
 
        public void AddProduct(Product product)
        {
            products.Add(product);
        }
 
        public void Print()
        {
            foreach (var product in products)
            {
                Console.WriteLine(product.Name);
            }
        }
    }
 
    public class Product
    {
        public string Name { get; set; }
    }

JavaScripts:

 var Order = function () {
            var products = [];
            this.addProduct = function (product) {
                products.push(product);
            };
 
            this.Print = function () {
                for (var i = 0; i < products.length; i++) {
                    console.log(products[i].Name);
                }
            }
        };
 
        var Product = function (name) {
            this.Name = name;
        }

双向关联
场景:订单和客户,订单属于客户,客户拥有一些订单

UML类图:

 C#:

public class Order
    {
        public User GetUserByOrderId(string orderId)
        {
            return new User();
        }
    }
 public class User
    {
        public List<Order> GetOrders()
        {
            return new List<Order>();
        }
    }

JavaScripts:

 var User = function (name) {
            this.Name = name;
 
            this.getOrder = function () {
                console.log("getOrder");
            };
        };
        var Order = function () {
 
            this.getUserByOrderId = function (id) {
                console.log("getUserByOrderId:" + id);
            };
        }

 

自身关联
同一个对象之间的关联

UML类图:

多维关联

多个对象之间存在联系

场景:公司雇佣员工,同时公司需要字符工资给员工

依赖(Dependency)

类A要完成某个功能必须引用类B,则A和B存在依赖关系,依赖关系是弱关联关系。

场景:司机和汽车

UML类图:

C#:

 public class Driver
    {
        public void Drive(Car car)
        {
            car.Run();
        }
    }
 
    public class Car
    {
        public void Run()
        {
            Console.WriteLine("跑起来了");
        }
    }

 JavaScripts:

  var Driver = function () {
            this.dirve = function (car) {
                if (car instanceof Car) {
                    car.run();
                } else {
                    throw new Error("参数异常,必须是Car类型");
                }
            }
        };
 
        var Car = function () {
            this.run = function () {
                console.log("跑起来了");
            }
        }

泛化(Generalization)
泛化就是类与类的的继承关系,类与接口的实现关系。

场景:狗是一个动物;鸟会飞

UML类图:

C#:

 public abstract class Animal
 {
 
 }
 
 public class Dog
 {

 }

JavaScripts:

 function Animal() { }
 
 function Dog() { }
 
 Dog.prototype = new Animal();
 Dog.prototype.constructor = Dog;
 
 var dog = new Dog();
 console.log(dog.constructor);
 console.log(dog instanceof Dog);

聚合(Aggregation)
当对象A被加入到对象B中,称为对象B的一部分时,对象A和B就存在聚合关系。聚合关系是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。

场景:大雁与雁群

UML类图:

C#:

public class GooseGroup
{
   public Goose goose;
 
   public GooseGroup(Goose g)
   {
       goose = g;
   }
 
}
 
public class Goose
{

}

 JavaScripts:

 var Goose = function() {
 
 };
 
 var GooseGroup = function(goose) {
     var _goose = goose;
     console.log(_goose);
};

组合(Composition)
对象A包含对象B,对象B离开对象A就没有存在的意义,是一种更强的关联关系。

场景:大雁和翅膀

UML类图:

C#:

 public class Goose
 {
     public Wing wing;
 
     public Goose()
     {
         wing = new Wing();
     }
 
}
 
public class Wing
{

}

 JavaScripts:

var Goose = function() {
     var wing = new Wing();
};
 
var Wing = function() {

};

区别

关联和依赖区别:

  • 从代码的角度看,依赖关系中依赖是作为方法的参数或返回值,或者方法的变量形式体现的;关联关系则是作为一个类的属性体现的,相比依赖,关联是更加固定,更为持久的持有的关系。
  • 从生命周期来看,依赖关系则是随着类的方法被调用时而产生,伴随着方法的结束而结束;关联关系则是当类实例化的时候即产生,当类的销毁时而结束,相比依赖,关联的生命周期更长。

聚合和组合区别:

  • 构造函数不同,聚合类的构造函数参数是另一个类的实例;组合类的构造函数包含另一个类的实例化。
  • 信息的封装性不同,聚合关系中,GooseGroup类和Goose类是独立的,客户端都可以访问到;组合关系中,客户端只能访问到Goose类,Wing类则访问不到,因为它被封装在Goose类中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry Nan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值